Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Datenformular Oberfläche (https://www.delphipraxis.net/170867-datenformular-oberflaeche.html)

VkPenguin 7. Okt 2012 14:50

Datenformular Oberfläche
 
Guten Tag zusammen,
ich habe ein Problem mit der Oberfläche zur Eingabe von Daten in Delphi. Das Endergebnis muss ähnlich sein wie die Registrierung einer Internetseite, es soll also Felder geben, in denen man etwas eintragen kann, ich brauche aber die Kontrolle darüber, was eingetragen werden darf (Also z.B. im Feld Geburtsdatum dürfen keine Buchstaben eingegeben werden). Das Problem: Diese Felder müssen 1. dynamisch erzeugt werden können und 2. in großer Anzahl verfügbar sein.

Bisher habe ich während der Laufzeit Checkboxen/Edittextfelder usw. erstellt, das ist bei der Menge an Feldern aber nicht praktikabel. Es muss beispielsweise eine Art zweidimensionales Array aus Checkboxen geben, die man nach belieben ankreuzen kann. Das Array kann aber bis zu 1000x1000 Felder groß werden - und die dynamische Erzeugung von derart vielen Checkboxen und Edittextfeldern macht Delphi einfach nicht mit.

(Nur falls das wichtig ist: Die erstellten Komponenten werden alle in einer Scrollbox untergebracht)

Einer meiner Lösungsansätze war, Excel in Delphi einzubinden und die Felder der Tabelle zu nutzen. Das funktioniert zwar auch im Prinzip, aber dann habe ich keine Kontrolle über die Eingabe und in welche Felder der Nutzer klicken/schreiben darf. Hat jemand eine Idee, wie ich das lösen könnte?

vielen Dank schoneinmal für eure Hilfe !

Bernhard Geyer 7. Okt 2012 15:09

AW: Datenformular Oberfläche
 
Zitat:

Zitat von VkPenguin (Beitrag 1186088)
Das Array kann aber bis zu 1000x1000 Felder groß werden - und die dynamische Erzeugung von derart vielen Checkboxen und Edittextfeldern macht Delphi einfach nicht mit.

Eher Windows macht hier (irgendwann) nicht mehr mit. Wenns ein Array ist würde sich eine Grid mit Inplace-Editoren anbieten. Spart ungemein GUI-Ressourcen da nur bei der aktuellen Grid-Zelle ein entsprechendes GUI-Control erzeugt werden muss.

DeddyH 7. Okt 2012 15:15

AW: Datenformular Oberfläche
 
Mich würde einmal interessieren, wie lange man als Anwender braucht, um 1.000.000 Checkboxen gewissenhaft durchzuarbeiten.

VkPenguin 7. Okt 2012 15:36

AW: Datenformular Oberfläche
 
@Bernhard: Danke Dir. Ressourcensparen hört sich gut an, ich habe von dem was du meinst aber noch nie etwas gehört. Kennst Du vielleicht ein Beispiel/Tutorial, das Du mir zeigen könntest, damit ich mir das mal ansehen kann?

@DeddyH: Ich weiß nicht recht wie ich das einfach erklären soll, aber im Prinzip erstellt der PC automatisch eine Art "Muster" mit diesen Checkboxen. Der Nutzer muss aber immer die Möglichkeit haben, bestimmte Felder zu ändern. 1000x1000 ist außerdem ein absoluter Extremfall, theoretisch muss es aber möglich sein. Aber du hast schon Recht: Optimal wäre es, wenn man ähnlich wie in Excel mehrere Felder mit der Maus makieren könnte.

himitsu 7. Okt 2012 16:08

AW: Datenformular Oberfläche
 
Dann mach es doch wie im Excel und nimm ein DataGrid, welches CheckBoxen als Datenfelder anbietet.

Der VirtualStringTree kann sowas
oder du nimmst andere spezielle Komponenten dafür.
Tipp: Man kann Datenbankkomponenten (z.B. DBDataGrids) nicht nur mit einer Datenbank verwenden (MemoryTables/MemoryDataSets ala TClientDataSet).

haentschman 7. Okt 2012 16:11

AW: Datenformular Oberfläche
 
Zitat:

Das Array kann aber bis zu 1000x1000 Felder groß werden
... kannst du mal erklären warum so viele Informationen auf einmal angezeigt werden müssen ? Wäre da nicht eine Art Wizzard, der im nächsten Schritt die Auswahlen einschränkt, nicht sinnvoller ?

Sir Rufo 7. Okt 2012 16:15

AW: Datenformular Oberfläche
 
Es müssen ja nicht wirklich Checkboxen sein.
Ein DrawGrid nehmen und dort auf den Click in ein Feld reagieren.
Die ClickInformation benutzen um in der Datenstruktur darunter den Wert festzulegen (Boolean) und anhand dieses Wertes im Drawagrid das Feld darstellen.

VkPenguin 7. Okt 2012 16:19

AW: Datenformular Oberfläche
 
@Himitsu: Entschuldige bitte die dumme Frage, aber du meinst TDBGrid, oder? Hab damit nämlich noch nie gearbeitet, schaue mir das aber mal an, danke!
@Haentschman: Ich hab auch schon überlegt, ob es vielleicht anders geht, aber im Kontext des Programms wüsste ich nicht wie. Und wie gesagt, 1000x1000 ist die absolute Obergrenze, im Normalfall werden es nur ca. 100x50 sein - nur muss mein Programm ja damit zurecht kommen, falls es mal mehr wird.
@Sir Rufo: Das ist auch eine gute Idee, werde auch das mal ausprobieren, danke!

Falls zufällig aus dem Kopf ein gutes Tutorial für Grids aller Arten kennt wäre ich dafür dankbar, ansonsten such ich es mir einfach selbst zusammen, ist auch kein Problem :)

haentschman 7. Okt 2012 16:58

AW: Datenformular Oberfläche
 
Zitat:

aber im Kontext des Programms wüsste ich nicht wie.
... und genau das solltest du mal ausfühlicher erläutern. Denn keiner kann verstehen
Zitat:

im Normalfall werden es nur ca. 100x50 sein
... wie man das übersichtlich anordnet, geschweige denn bedient.

Sonst können wir dir keine Alternativen vorschlagen.

VkPenguin 7. Okt 2012 17:08

AW: Datenformular Oberfläche
 
@haentschman: Es geht um ein Codesystem, wie es z.B. in Hotels für Türschlösser verwendet wird. Man bekommt eine Karte und kann damit bestimmte Türen öffnen. Im Programm soll man auswählen können, welche Türen welche Karte öffnen kann. Standartmäßig öffnet jede Karte die dazugehörige Tür und die Haustür, aber das kann manchmal auch anders sein. Und wenn es nunmal 1000 Türen und Karten gibt... Eigentlich sollte das aber kein Problem sein, ich bin nur sehr unerfahren mit Delphi. Momentan versuche ich zum Beispiel rauszubekommen, wie ich prüfen kann, welche Zellen einer Stringgrid makiert sind.

himitsu 7. Okt 2012 17:16

AW: Datenformular Oberfläche
 
Eventuell könnte es mit 2 Listen übersichtlicher sein.

Eine Liste, wo alle Türen drinstehn, welche mit der Karte verknüpft sind
und dann gibt es eine Liste, wo alle Türen drinstehn (eventuell noch gruppiert nach Etage oder Dergleichen) und dazu noch ein Edit, wo man einen Filter (Bestandteil des Namens) angeben kann.

Sir Rufo 7. Okt 2012 17:35

AW: Datenformular Oberfläche
 
Zitat:

Zitat von himitsu (Beitrag 1186125)
Eventuell könnte es mit 2 Listen übersichtlicher sein.

Eine Liste, wo alle Türen drinstehn, welche mit der Karte verknüpft sind
und dann gibt es eine Liste, wo alle Türen drinstehn (eventuell noch gruppiert nach Etage oder Dergleichen) und dazu noch ein Edit, wo man einen Filter (Bestandteil des Namens) angeben kann.

Also wenn es so um die 1000 Türen/Karten gibt, dann ist eine Eingabe über Listen doch sehr unübersichtlich und eine Darstellung per Grid durchaus angebracht.
Dabei würde ich die Türen im Grid bezogen zur Etage darstellen. Also in einer Zeile sind nur Türen aus der gleichen Etage.
In der Zelle die Tür-Nummer und wenn sich die Maus über einer Zelle befindet würde ich noch erweiterte Informationen zu der Tür (was ist denn dahinter) anzeigen lassen.
Mit dem DrawGrid ist es ja kein Problem da mit Grafiken und Farben zu arbeiten um das sehr übersichtlich zu gestalten.

himitsu 7. Okt 2012 17:51

AW: Datenformular Oberfläche
 
Man kann es auch noch kombinieren.
- in der Liste steht alles
- und im Grid z.B. je eine Etage (das könnte man noch weitertreiben und einen Grundriß anbieten, wo man die Türen darin auswählt)

VkPenguin 7. Okt 2012 17:53

AW: Datenformular Oberfläche
 
@Himitsu/Sir Rufo: Das sind eigentlich nette Ideen, danke, aber die Oberfläche ist so leider ausdrücklich gewünscht wie ich sie beschrieben hab (aus praktischen Gründen, um das zu erklären müsste ich weit ausholen, spielt aber ja eigentlich auch keine Rolle). Ich denke aber, wie SirRufo schon sagte, dass man mit einer StringGrid/DrawGrid gut zurecht kommen kann(Wenn man sich denn damit auskennt... ;-) ), nur finde ich (bisher zumindest) keine brauchbare Möglichkeit, die Selektierten Zellen einer Stringgrid zu verändern.

Folgendes wäre ja schon ausreichend (Wobei sich eine Drawgrid aufgrund der Übersichtlichkeit wohl doch besser eignen würde):
Delphi-Quellcode:
*Pseudocode*
For X:=1 To Stringgrid.ColCount Do
 Begin
 For Y:=1 To Stringgrid.RowCount do
  Begin
  If Stringgrid[X,Y].Selected then if Stringgrid[X,Y]='True' then Stringgrid[X,Y]='False' else Striggrid[X,Y]='True';
 End;
End;
Also wenn das Event per Tastendruck ausgelöst wird, tauscht die Procedur den Wert aller makierten Zellen aus. Stringgrid[X,Y].Selected gibt es aber ja scheinbar nicht. Ich habe zwar DAS finden können, aber in meinem Programm sollen ja mehrere Zellen gleichzeitig selektierbar sein

@SirRufo: Das mit den Informationen ist übrigens eine tolle Idee, wäre das vielleicht mit den Hints möglich? Dann könnte man theoretisch doch auch zu den Angaben (Name, Zimmernummer, Bettenanzahl etc.) kommen, wenn man auf eine Zeile doppelklickt, oder?

Gibt es denn irgendwo eine Übersicht über die Grids? DIESE ist zwar für den Anfang nicht schlecht, aber viele Informationen fehlen mir dabei...

sx2008 7. Okt 2012 17:58

AW: Datenformular Oberfläche
 
Also ich denke hier fehlt eine zusätzliche Ebene.
Zum Beispiel sollte es möglich sein die Räume in Gruppen zu ordnen.
Es gibt dann z.B. Technikräume, Personalräume, Sicherheitsbereiche, Geschäftführung,
Gästezimmer 1.Stock, Gästezimmer 2.Stock, ...

Das Gleiche kann man auch mit den Karten machen.
Es gibt Standardkarten, Mitarbeiterkarten, Masterkarten, ...

Dann braucht man nur noch definieren:
Masterkarten dürfen in alle Räume ausser in die Räume der Geschäftführung.
Mitarbeiterkarten dürfen in die Personalräume.
...

Jede Karte jedem einzelnen Raum zuzuorden ist viel zu kompliziert.
Mit den Gruppen wird das erteilen oder entziehen von Zutrittsrechten stark vereinfacht.

VkPenguin 7. Okt 2012 18:20

AW: Datenformular Oberfläche
 
Wie gesagt, ich verstehe die Idee dahinter und danke Euch für den Tipp, aber das steht leider nicht zur Diskussion. Danke aber aufjedenfall auch nocheinmal für die Anregung, Grids zu verwenden. Ich wünschte nur, die hätten eine so einfach verständliche API wie Excel, dann wäre ich schon fertig :)

sx2008 7. Okt 2012 18:29

AW: Datenformular Oberfläche
 
Zitat:

Zitat von VkPenguin (Beitrag 1186133)
, aber das steht leider nicht zur Diskussion.

Nun ja - Kunden, die Software bestellen sind manchmal stur und unwissend.
Das was sie wollen ist nicht das was sie brauchen!!
Wenn man als Softwareentwickler nicht versucht den Kunden von einer besseren Lösung zu überzeugen, dann wird die Software eben nicht wirklich erfolgreich sein.
Denn meistens ist der Besteller <> der Benutzer.
Aber manchmal muss man den Kunden zu seinem Glück zwingen.

Wenn nicht zur Diskussion steht, wie eine Software sein Ziel erreichen soll, dann läuft etwas ganz arg schief!

VkPenguin 7. Okt 2012 18:51

AW: Datenformular Oberfläche
 
Nein nein, so war das gar nicht gemeint. Es gibt Gründe, warum die Oberfläche in diesem Fall so sein muss und nicht in Etagen unterteilt werden kann. Nur die im Kontext auszuführen würde recht lange dauern und spielt ja auch eigentlich keine Rolle, glaubt mir einfach, dass es dafür einen Grund gibt. Zu euch kam ich ja, weil ich auf der Suche nach Tipps bin, wie ich das als unerfahrener Delphianer hinkriege. Immerhin, ein bisschen bin ich ja schon weitergekommen: Ich glaube, der Ausdruck, den ich suche, um die selektierten Zellen zu erfassen ist ähnlich wie "state = [gdSelected]".

Hobby-Programmierer 7. Okt 2012 19:04

AW: Datenformular Oberfläche
 
Hallo ...,
ne kleine Lektüre für zwischendurch :wink:
http://www.ansatheus.de/_at_dokserve...stringgrid.pdf
oder aber gleich
https://www.google.de/search?hl=de&c...LM334QTzyoDABw

VkPenguin 7. Okt 2012 19:21

AW: Datenformular Oberfläche
 
Danke Dir :) Auf den "Seiten" war ich zwar schon, hatte aber nach "gdSelected" gesucht, was dort nicht auftauchte. Aber ein anderes Beispiel hats ja auch getan. Allerdings steht diese Abfrage bei mir ja nicht in OnDrawCell. Das war meine erste Lösung, aber die funktionierte nur, wenn ich Enter gedrückt halte, während ich die Zelle selektiere. Es kann aber ja auch sein, dass ich erst zwei Sekunden, nachdem ich die Zelle selektiert habe, Enter drücke. Trotzdem soll die Zelle dann entsprechend eingefärbt werden. Aber wenn ich innerhalb des OnKeyPress Events nach gdSelected frage, muss ich ja erstmal an den State der jeweiligen Zelle kommen.

Hobby-Programmierer 7. Okt 2012 19:26

AW: Datenformular Oberfläche
 
Hmm, wie wäre es mit der Suchfunktion hier im Forum ;)
http://www.delphipraxis.net/98118-st...einfuegen.html
http://www.delphipraxis.net/128457-s...ermitteln.html

Edit: das färben der Zelle musst du selbst übernehmen. Stichwort 'DrawCell'
Edit2: die selektierte Zelle kannst du ganz leicht im OnClick Event abfragen.
http://www.delphipraxis.net/418610-post3.html

Sir Rufo 7. Okt 2012 19:37

AW: Datenformular Oberfläche
 
Also ich würde ein DrawGrid hier bevorzugen.
Ein StringGrid ist immer praktisch, wenn man Text darstellen will und evtl. der Benutzer diesen Text bearbeiten soll.
Hier soll aber etwas ausgewählt und per Klick oder Tastendruck ein Zustand geändert werden. Da könnten die Funktionen vom StringGrid etwas im Wege sein um es perfekt erscheinen zu lassen.

Da das StringGrid aber eine Ableitung vom DrawGrid ist, arbeiten beide Varianten ziemlich ähnlich

Hobby-Programmierer 7. Okt 2012 19:53

AW: Datenformular Oberfläche
 
Aber da er noch in der 'Probier'-Phase ist, wird ein Stringgrid leichter zu handeln sein. Ansonsten stimme ich dir voll zu.

VkPenguin 7. Okt 2012 19:57

AW: Datenformular Oberfläche
 
... :duck:

Peinlich. Ich hab zwar genau danach gesucht, aber nur über Google, weil ich dachte "Wenn es hier im Forum was gibt wirds ja auch auf Google zu finden sein". Tja..

Soviel sinnloser Aufwand wegen einem (fast) Einzeiler. Aber jetzt gehts ja, Dankeschön! :-D

Jetzt mach ich mich dann mal an die Arbeit, falls es noch was zu dem Thema gibt melde ich mich nochmal..

Danke nochmal an alle!

VkPenguin 8. Okt 2012 16:51

AW: Datenformular Oberfläche
 
Hallo nocheinmal,

dank Euren Tipps komme ich mit dem Färben und anpassen der Grids zwar gut klar und mache viele Fortschritte, eine Sache gibt es aber noch. Ich habe die Stringgrid so eingestellt, dass die selektierte Zelle Blau und alle anderen makierten Zellen rötlich eingefärbt sind. Zur Übersicht wird jede zweite Spalte/Reihe leicht gräulich verfärbt. Nur wenn ich in eine der Verfärbten Zellen etwas schreibe wird sofort das OnDrawCell Ereignis ausgelöst, welches den Text wieder übermalt. Zuerst hab ich versucht, den Text danach einfach nocheinmal schreiben zu lassen, das bringt aber nichts, da dann sofort wieder das Ereignis ausgelöst wird. Ich habe im Forum auch mal nach transparenten Farben / transparentem zeichnen mit Canvas gesucht, das gibt es aber nicht bzw. wäre sehr aufwändig. Hat jemand vielleicht eine Idee, wie ich das Problem lösen könnte oder mit welchen Suchbegriffen ich mich durchhangeln könnte ? Dankeschön schoneinmal :)

VkPenguin 8. Okt 2012 23:20

AW: Datenformular Oberfläche
 
Hm, habe gerade mal in einem kleinen Testprogramm versucht, den Inhalt und die Farbe als Bitmap zu Speichern und diese dann wiederum in der Tabelle auszugeben. Das erscheint mir aber erstens sehr umständlich und zweitens vor allem nicht gerade performant, wenn man bedenkt mit welchen Listengrößen ich hier hantiere.. Hat da vielleicht jemand einen besseren Ansatz für mich ? Komme hier irgendwie nicht weiter

Sir Rufo 8. Okt 2012 23:27

AW: Datenformular Oberfläche
 
Nein, so macht man das auch nicht ;)

Alles was dort erscheinen soll musst du im OnDrawCellEvent erledigen also zeichnen.
Zeig doch mal den Code den du bislang dort stehen hast

EDIT

Bitte definiere doch auch was du unter "etwas schreibe" genau meinst.
Soll der Anwender da etwas schreiben, oder die Anwendung Text ausgeben?

VkPenguin 9. Okt 2012 00:22

AW: Datenformular Oberfläche
 
Mein bisheriges OnDrawCellEvent (Der Umweg über "sg", da ich mehrere Stringgrids hab, die ich gleich Formatieren möchte):
Delphi-Quellcode:
sg := TStringGrid (Sender);
if (((((ARow+1) mod 2 <> 0) And (ARow<>0) AND (ACol<>0))) OR (((ACol+1) mod 2 <> 0) And (ACol<>0) AND (ARow<>0))) then
begin //Färbe jede zweite Zelle zur Übersicht ein (Außer die Erste Spalte/Reihe)
sg.canvas.brush.color := cl3DLight;
sg.canvas.FillRect(Rect);
end;
if ((ARow>=sg.Selection.Top) AND (Arow<=Sg.Selection.Bottom) AND (ACol>=sg.Selection.Left) AND (ACol<=Sg.Selection.Right)) then
Begin //Färbt die makierten Felder
sg.canvas.brush.color := $FACE87;
sg.canvas.FillRect(Rect);
End;
if ((Arow=sg.Row) ANd (ACol=sg.Col)) then
Begin //Färbt das selektierte Feld
sg.canvas.brush.color := $0045FF;
sg.canvas.FillRect(Rect);
End;
Wenn ich ein Feld mit Text(z.B. "TEST" oder "111222333") selektiere verschwindet der Text, da er von dem OnDrawCell-Event übermalt wird. Sobald ich die Selektion aufhebe ist der Text aber wieder sichtbar, der Inhalt geht also nicht verloren, wird nur überzeichnet.

Der Inhalt der Felder kann je nachdem sowohl vom Nutzer als auch vom Programm selbst verändert werden.

Ich schätze mal, ich verstehe nicht ganz richtig, was du mit "Alles was dort erscheinen soll..." meinst, aber einen ähnlichen Gedanken hatte ich auch schon, daher stand probehalber mal
Delphi-Quellcode:
for X:=0 To Sg.ColCount do
 Begin
 for Y:=0 To Sg.RowCount do
   Begin
   if Sg.Cells[X,Y]<>'' then sg.Cells[X,Y]:=sg.Cells[x,Y];
   End;
 End;
am Ende des Events, da ich mir erhofft hatte, durch die "Änderung" des Inhalts würde der Text nocheinmal neu (-> Über die Farbe) geschriben. Es führt aber nur dazu, dass die gesamte Tabellendarstellung flimmert (Wahrscheinlich, da dadurch dasselbe Event immer wieder aufgerufen wird).

Sir Rufo 9. Okt 2012 05:59

AW: Datenformular Oberfläche
 
Vielleicht hilft dir ja ein
Delphi-Quellcode:
sg.Canvas.TextRect
wo der Text dann auch gemalt wird.
Das meinte ich mit "Alles" ;)

Siehe dazu auch http://www.delphipraxis.net/1177538-post5.html

Hobby-Programmierer 9. Okt 2012 09:15

AW: Datenformular Oberfläche
 
Moin...,
versuche mal folgendes:
Delphi-Quellcode:
const tFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER;
var tText: String;
begin
  with (Sender as TStringGrid) do begin
    tText:= Trim(Cells[ACol, ARow]); // Text der Zelle
    if (gdFixed in State) then begin // fixe Zelle
      // feste Zellen bleiben unberührt
     end // (gdFixed in State)
     else begin // nicht fixe Zellen
      if (gdSelected in State) then begin // markierte Zelle
        Canvas.Brush.Color:= clHighlight; // HintergrundFarbe selektierte Zelle
        Canvas.Font.Color:= clBlack;      // Schriftfarbe

       end else begin // normale Zelle
        if Odd(ARow) then // alle ungeraden Zeilen
          Canvas.Brush.Color:= clMoneyGreen // einfärben
         else
          Canvas.Brush.Color:= clInfoBk;    //

      end; // <> (gdFixed in State)
      Canvas.FillRect(Rect); // Hintergrund zeichnen
      DrawText(Canvas.Handle, PChar(tText), Length(tText), Rect, tFormat); // Textausgabe
      // formatierte Textausgabe könnte auch über ExtTextOut() erfolgen
    end; // nicht fixe Zellen
  end; // with
end;

VkPenguin 9. Okt 2012 15:16

AW: Datenformular Oberfläche
 
Danke Ihr zwei, jetzt hab ichs. Das mit Drawtext war mir einfach entgangen :)

VkPenguin 10. Okt 2012 20:39

AW: Datenformular Oberfläche
 
Guten Abend, ich bin es nochmal :(

Es tut mir leid, dass ich euch schon wieder mit Fragen zu diesem Thema löchere, hatte eigentlich gehofft, jetzt allein weiterzukommen. Aber bei meiner Stringgrid gibt es noch ein Problem, mit dem ich nicht fertig werde. Ich möchte die Eingaben des Nutzers kontrollieren, wenn er eine Zelle Editiert (in manchen Zellen sind beispielsweise nur die Werte 1,2,3 erlaubt). Bisher habe ich das mit SetEditText abgefangen, aber wenn die Zelle noch leer ist und der Benutzer sie gerade erst anklickt kommt eine Fehlermeldung, da die leere Zelle weder den Wert 1 noch 2 oder 3 hat. Ich bräuchte also ein Event, welches erst ausgelöst wird, wenn der Nutzer mit seiner Bearbeitung fertig ist.
Aber es gibt sowohl unterschiedliche Eingabemöglichkeiten - direkt über das Programm, manuell vom Nuter oder STRG+V (Was ich mit OnKeyDown abfange und dann auf alle selektierten Zellen übertrage, damit bin ich auch nicht wirklich zufrieden, es funktioniert manchmal nämlich aus irgendeinem Grund nicht...) - als auch verschiedene Arten, das Editieren zu beenden (Selektion eines anderen Feldes, Tab, Enter, Selektion eines anderen Objekts oder sogar Form/Programms...), dass ich es, egal wie ich es auch versuche, nie schaffe, alle Möglichkeiten sauber und zuverlässig abzufangen.
Ich habe schonmal nach "On Edit" und ähnlichem gesucht, konnte aber leider nicht viel hilfreiches finden. Auf dieser Seite ist von WM_ACTIVATE und WM_KILLFOCUS die rede.... Auf der Suche danach bin ich auf das gestossen; ich glaube, das ist es, was ich suche. Meine bisherigen Versuche damit waren allerdings erfolglos - hat vielleicht jemand einen Tipp oder besseren Lösungsansatz?

Hobby-Programmierer 10. Okt 2012 21:10

AW: Datenformular Oberfläche
 
Nabend ...,
der InplaceEditor arbeitet manchmal, sagen wir mal, gewöhnungsbedürftig ;)
Aber ich halte den Ansatz, Eingaben bzw. rein kopierte Strings über den Editor zu filtern, für falsch. Ich würde generell auf den Editor verzichten und zb. bei Doppelklick ein separates 'Eingabefenster' öffnen. In diesem könntest du dich austoben, danach würde ich die gemachten Eingaben prüfen, bearbeiten was auch immer und gleich in die Db wegsichern und erst dann die markierten Zellen schreiben.

Edit: ok, Doppelklick ist natürlich blöd bei Mehrfachauswahl 8-)
also solltes du dann ne bestimmte Taste abfangen zum öffnen des Eingabefensters zb. Tab oder zirkumflex oder so.

VkPenguin 10. Okt 2012 21:25

AW: Datenformular Oberfläche
 
Der Plan war aber (Da die Stringgrid sehr groß werden kann), dass man beliebig viele Zellen markieren kann und dann in alle markierten gleichzeitig schreibt/kopiert etc...

Oder hab ich Dich falsch verstanden?

*Edit* Wie meinst du das denn mit dem separatem Eingabefenster? Wenn wirklich ein neues Fenster dafür aufgeht verliert man ja die Übersicht... Außerdem ist es sehr wichtig, dass alles möglichst schnell geht

Hobby-Programmierer 10. Okt 2012 21:41

AW: Datenformular Oberfläche
 
Ich glaube du denkst zu kompliziert.
Ich meinte: Du markierst alle zu editierenden Zellen wie bisher, aber statt den InplaceEditor zu benutzen öffnest du ein neues Eingabefenster, machst die Eingabeoperationen und schließt des wieder. Beim schließen wird die Db geschrieben sowie die Eingaben an das Grid weitergereicht.
Dieses besagte Eingabefenster musst du natürlich selbst erstellen, praktisch dein eigener Editor. der Vorteil ist natürlich das du des auf deine Bedürfnisse quasi massschneidern kannst.

Edit: vielleicht könntest du ein Demo von deinem programm kurz hier anhängen. Ich kann mir ehrlich gesagt immer noch net vorstellen wie du die tausende zellen darstellst.

VkPenguin 10. Okt 2012 22:27

AW: Datenformular Oberfläche
 
So, nach ein bisschen basteln funktioniert es jetzt (fast) wie gedacht. Jetzt muss ich es nur noch schaffen, dass die Selektion bei Doppelklick/Enter nicht aufgehoben wird.
Vielen Dank nochmal für Deinen Tipp, dank Dir ist endlich der Groschen gefallen. Manchmal fragt man sich wirklich, wieso man es nicht gleich so gemacht hat :)

*Edit* Achja. Ich hab für das Eingabefenster ein Edittextfeld umfunktioniert - es klappt auch -, aber wenn ich Enter drücke kommt immer ein Fehlermeldungsgeräusch, das ist etwas seltsam. Ist mir aber schon mehrfach bei Edittexten aufgefallen

Hobby-Programmierer 10. Okt 2012 22:32

AW: Datenformular Oberfläche
 
Delphi-Quellcode:
procedure TForm1.DeinSGKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_RETURN) then begin
    frm_Eingabe.Show; // eigenes Editorfenster
  end;
end;
Sollte so funktionieren.
Edit: Du solltest das Eingabefenster aber Modal anzeigen.

VkPenguin 10. Okt 2012 22:55

AW: Datenformular Oberfläche
 
So ähnlich siehts bei mir auch aus. Nur, ähm, modal? :?

Furtbichler 11. Okt 2012 07:16

AW: Datenformular Oberfläche
 
MyForm.ShowModal => Das Formular bekommt alle Maus- und Tastenereignisse exklusiv, bis man es schließt.
MyForm.Show => Das Formular ist sichtbar und bekommt alle Maus- und Tastenereignisse, wenn man es selektiert (anklickt).

Perlsau 11. Okt 2012 09:01

AW: Datenformular Oberfläche
 
Zitat:

Zitat von VkPenguin (Beitrag 1186584)
... aber wenn ich Enter drücke kommt immer ein Fehlermeldungsgeräusch, das ist etwas seltsam. Ist mir aber schon mehrfach bei Edittexten aufgefallen

Durch eine Zuweisung von #0 an Key bleibt das Fehlergeräusch aus:

Delphi-Quellcode:
procedure TFormMain.Edit_FeldKeyPress(Sender: TObject; var Key: Char);
begin
     IF Key = #13 THEN
     BEGIN
          IF TextIstZahl(Edit_Feld.Text) THEN
          BEGIN
               Do.Something;   // oder mach was anderes ...
               Do.AnotherThing;
               // ... weise irgendwas irgendwem zu oder mach was du willst ...
          ELSE ShowMessage('fehlerhafte Eingabe: Nur Ziffern erlaubt ...');
     END;

     Key := #0;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz