Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Listboxeinträge per Kontextmenü bearbeiten


lexmy3 - Mi 04.01.06 13:38
Titel: Listboxeinträge per Kontextmenü bearbeiten
Malzeit,

So mit Drag&Drop innerhalb der CheckListBox habe ich es heute schon geschafft
http://www.delphi-forum.de/topic_Verschieben+der+Items+innerhalb+einer+CheckListBox+per+Dragamp_53942.html
aber aus der CheckListBox ins Edit-Feld zum Bearbeiten der Items nicht und finde nix hilfreiches hier.

Hat einer vieleicht nen Tip für mich.

Oder eine Idee wie ich die Zeilen der CheckListbox wärend der Laufzeit bearbeiten kann.

Mfg

Lexmy3[dp]


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

user profile iconNarses 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

user profile iconNarses 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

user profile iconfrank-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); // rausfinden, wohin geklickt wurde
  if (i > -1then begin // ist ein (gültiges) Item
    ListBox1.ItemIndex := i; // dann Markierung verschieben
    ListBox1Click(Sender); // ggfs. Aktionen beim (normalen) Anklicken nachholen (wg. Änderung der Markierung)
  end
  else
    i := ListBox1.ItemIndex; // sonst bleibt das aktuelle Item markiert
  // hier könnten mit dem Item i noch Aktionen laufen
  Handled := FALSE; // Kontextmenü aufrufen, Aktion noch nicht beendet
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!

user profile iconlexmy3 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.

user profile iconlexmy3 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!

user profile iconlexmy3 hat folgendes geschrieben:
Wofür ist dieser Code Verantwortlich??

Delphi-Quelltext
1:
CheckListBoxGeneralClick(Sender); // ggfs. Aktionen beim (normalen) Anklicken nachholen (wg. Änderung der Markierung)                    

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: