Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Listboxeinträge per Kontextmenü bearbeiten
Narses - Mi 04.01.06 13:50
Moin!
Das mit den D&D ist ja ´n nettes Feature, aber meinst du nicht, dass ein Kontextmenü (R-Klick auf den Eintrag in der Box) mit der Option "Edit" oder "Bearbeiten" oder was auch immer, intuitiver ist?
cu
Narses
lexmy3 - Mi 04.01.06 13:55
Narses hat folgendes geschrieben: |
Moin!
Das mit den D&D ist ja ´n nettes Feature, aber meinst du nicht, dass ein Kontextmenü (R-Klick auf den Eintrag in der Box) mit der Option "Edit" oder "Bearbeiten" oder was auch immer, intuitiver ist?
cu
Narses |
Sehr gerne wenn du mich dahin lotzen kannst/willst, dann wäre es richtig gut!!!
Also meine ursprüngliche Idee war die Zeilen in der CheckListBox bearbeiten zu konnen. Und ich weiß nicht wie, deswegen kamm ich auf die Idee diese erst ins Edit zu zihen um dort zu bearbeiten.
Bin für alle Vorschläge offen!!
mfg
Lexmy3
Narses - Mi 04.01.06 14:00
Moin!
Ich kann´s ja mal versuchen.
Aaalso: Ein Popup-Menü auf´s Form ziehen, einen Punkt "Bearbeiten" darin anlegen, der Eigenschaft .Popup der Listbox dieses Popup zuweisen und das Projekt erstmal testweise starten. Jetzt sollte mit einem Rechtsklick in der Listbox das Menü mit dem (einzigen) Befehl "Bearbeiten" sehen.
Handshake - bis hierher alles fit?
cu
Narses
Delete - Mi 04.01.06 14:01
Hier eine ganz einfache Möglichkeit....
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.ListBox1Click(Sender: TObject); begin edit1.text:=Listbox1.Items[ListBox1.ItemIndex]; end;
procedure TForm1.Edit1Change(Sender: TObject); begin ListBox1.Items[ListBox1.ItemIndex]:=Edit1.Text; end; |
Du wirst wohl das passende für dich raus machen können
Gruß Frank
Narses - Mi 04.01.06 14:05
Moin!
Geht natürlich auch so; ich hätte in meinem Ansatz aber das Edit-Feld "gespart" und ein InputQuery oder - je nach Einsatzzweck - einen weiteren Dialog genommen.
Wo willst du weiter machen?
cu
Narses
Delete - Mi 04.01.06 14:10
Die Methoden bleiben ja die gleichen. Egal ob der Text aus einer InputQuery oder einem TEdit kommen. Über Kontext Menü wäre sicherlich eleganter. Kommt aber auch darauf an was er machen möchte. Will er viele Einträge schnell ändern, hat er mit einem Klick den Text im Editfeld.
Gruß Frank
lexmy3 - Mi 04.01.06 14:28
Narses hat folgendes geschrieben: |
Moin!
Geht natürlich auch so; ich hätte in meinem Ansatz aber das Edit-Feld "gespart" und ein InputQuery oder - je nach Einsatzzweck - einen weiteren Dialog genommen.
Wo willst du weiter machen?
cu
Narses |
Hey,
bis jetzt habe ich deinen Vorschlag umgesetzt und es sieht gut aus. Jetzt muss ich nur unter Bearbeiten die einzelne Zeilen edetieren können.
Also mit Popup habe ich noch nix gemacht!!
So denn??
lexmy3 - Mi 04.01.06 14:42
frank-wob hat folgendes geschrieben: |
Hier eine ganz einfache Möglichkeit....
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.ListBox1Click(Sender: TObject); begin edit1.text:=Listbox1.Items[ListBox1.ItemIndex]; end;
procedure TForm1.Edit1Change(Sender: TObject); begin ListBox1.Items[ListBox1.ItemIndex]:=Edit1.Text; end; |
Du wirst wohl das passende für dich raus machen können
Gruß Frank |
Hey,
dein Vorschlag ist auch sehr gut und vorallem Schnell. Danke für prompte Reaktion
Jedoch den anderen Vorschlag finde ich auch eleganter.
So denn ich warte auf weitere Anweisungen vom Narses!!!
Narses - Mi 04.01.06 15:10
Moin!
Also dann: du mußt jetzt noch dafür sorgen, dass mit dem R-Klick auch das passende Element ausgewählt wird. Das geht so (entsprechendes der ListBox Ereignis anlegen):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.ListBox1ContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); var i: Integer; begin i := ListBox1.ItemAtPos(MousePos,TRUE); if (i > -1) then begin ListBox1.ItemIndex := i; ListBox1Click(Sender); end else i := ListBox1.ItemIndex; Handled := FALSE; end; |
Damit kannst du nun davon ausgehen, dass beim Anklicken der Aktion "Bearbeiten" im Kontextmenü auch das "richtige" Item ausgewählt ist (vorausgesetzt es sind Items drin; entsprechende Fehlerprüfungen sind natürlich noch selbst zu leisten).
Jetzt zu der Aktion selbst: Doppelklick auf dem Befehl "Bearbeiten" (im Popupmenü-Editor), damit ein Ereignishandler erstellt wird. Darin dann z.B. sowas machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Bearbeiten1Click(Sender: TObject); var Eingabe: String; begin Eingabe := ListBox1.Items.Strings[ListBox1.ItemIndex]; if InputQuery('Eintrag bearbeiten','Neuer Text: ',Eingabe) then ListBox1.Items.Strings[ListBox1.ItemIndex] := Eingabe; end; |
Soweit klar?
cu
Narses
lexmy3 - Mi 04.01.06 15:24
Und wie lege ich die Procedure ContextPopup an???
bzw wo gibt es diese??
Ich habe D5.!!!
Narses - Mi 04.01.06 15:29
Moin!
Listbox auswählen, im ObjectInspector auf Ereignisse, Doppelklick auf ContextPopup.
cu
Narses
lexmy3 - Mi 04.01.06 15:44
Ok habe alles gemacht. Und es funktioniert auch.
Doch es kommt eine Meldung: [Hinweis] Unit2.pas(222): Auf 'i' zugewiesener Wert wird niemals benutzt
Supper, jedoch dieses Zusatz Fenster ist einwenig zu klein für meine Einträge. Kann mann dieses anpassen??
Mfg
Lexmy3
Narses - Mi 04.01.06 15:55
Moin!
lexmy3 hat folgendes geschrieben: |
Doch es kommt eine Meldung: [Hinweis] Unit2.pas(222): Auf 'i' zugewiesener Wert wird niemals benutzt |
Ja, das liegt daran, dass ich dir ein allgemeineren Ansatz gegeben habe, als minimal nötig wäre. Wenn du mit dem Item in der Prozedur, die das Kontextmenü öffnet, nix weiter machen willst (du könntest z.B. vorher die Befehle des Kontextmenüs abhängig vom aktuell ausgewählten Item de/aktivieren, oder sogar das Öffnen des Kontextmenüs selbst unterbinden ->
Handled := TRUE;), dann lösch einfach die Zeile, die in der Warnung angegeben ist.
lexmy3 hat folgendes geschrieben: |
Supper, jedoch dieses Zusatz Fenster ist einwenig zu klein für meine Einträge. Kann mann dieses anpassen?? |
Nein, das ist praktisch in den Befehl InputQuery eingebaut. Erstell einfach ein weiteres Formular, dass genau auf deine "Bedürfnisse" angepasst ist, wenn dir das so zu knapp ist.
cu
Narses
lexmy3 - Mi 04.01.06 16:11
Wofür ist dieser Code Verantwortlich??
CheckListBoxGeneralClick(Sender); // ggfs. Aktionen beim (normalen) Anklicken nachholen (wg. Änderung der Markierung)
Weil Jetzt kommt dies??
[Fehler] Unit2.pas(220): Undefinierter Bezeichner: 'CheckListBoxGeneralClick'
Mfg
Lexmy3
Narses - Mi 04.01.06 16:33
Moin!
lexmy3 hat folgendes geschrieben: |
Wofür ist dieser Code Verantwortlich??
Delphi-Quelltext 1:
| CheckListBoxGeneralClick(Sender); |
Weil Jetzt kommt dies??
Quelltext 1:
| [Fehler] Unit2.pas(220): Undefinierter Bezeichner: 'CheckListBoxGeneralClick' | |
OK, die "Langversion"... :wink:
Der "Code" ist der Aufruf der normalen OnClick-Prozedur, weil du per
.ItemIndex := i ja praktisch ein neues Item auswählst. Möglicherweise sollen aber beim Auswählen von Items per Mausklick noch Aktionen ablaufen, da aber das Beschreiben von
.ItemIndex nicht das Ereignis auslöst, kannst du es hier sozusagen manuell nachholen.
Soweit klar? :wink:
cu
Narses
PS: Könntest du den Titel des Topics dem jetzt eher komplett anderen Verlauf der Diskussion etwas anpassen? :arrow: Damit würdest du "kommenden Generationen von DF-Lesern" deutlich die Suche erleichtern... :wink: Danke.
PPS: Ich will ja nicht rumnerven, aber was hälst du von "Listboxeinträge per Kontextmenü bearbeiten" als Titel? :wink:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!