![]() |
TListBox - Eintrag makrieren (Fokus setzen?)
Hallo,
Ich habe ein Hauptformular, in dem sich eine TListBox befindet. Ich möchte darin dann einzelne Einträge nach oben bzw. nach unten verschieben. Gelöst habe ich das Problem mit folgender Methode: Hier noch falls es erklärt werden sollte: EditList = TListBox UpButton / DownButton sind die entsprechenden Button's (wer hätte das gedacht? :-))
Delphi-Quellcode:
// -- nach oben bewegen --
procedure MainForm.UpButtonClick(Sender: TObject); begin if MainForm.EditList.ItemIndex > 0 then MainForm.EditList.Items.Move(MainForm.EditList.ItemIndex, MainForm.EditList.ItemIndex - 1); MainForm.EditList.SetFocus; end;
Delphi-Quellcode:
Das try ... except ist nur weil ich immer eine Exception bekam, sobald ich gerade ein Element nach unten bewegt hatte und der Fokus nicht mehr auf einem Eintrag stand. Und genau da liegt mein Problem:
// -- nach unten bewegen --
procedure MainForm.DownButtonClick(Sender: TObject); begin try if (MainForm.EditList.ItemIndex < (MainForm.EditList.Items.Count - 1)) and (MainForm.EditList.Items.Count > 1 ) then MainForm.EditList.Items.Move(MainForm.EditList.ItemIndex, MainForm.EditList.ItemIndex + 1); except end; S_Alg.EditList.SetFocus; end; Ich möchte gern, dass bei einem Move der geschobene Eintrag den Fokus erhält (und selektiert = [blau] unterlegt ist). Den Fokus hat der Eintrag zumindest bei dem MoveUp immer noch. Bei dem MoveDown wandert der Fokus allerdings auch nach oben (anstatt nach unten) und man ist dann zwei Einträge weg von dem eigentlich gewünschten Element. Auch verschwindet die Selektierung einfach (die würde ich halt gerne nachträglich setzen). Mit TListItem.Focused kann man ja abfragen ob ein bestimmter Eintrag fokusiert ist. Allerdings müsste ich setzen und nicht abfragen... Geht das? Und wenn ja, wie? :gruebel: Danke für Eure Hilfe schonmal! :bounce2: |
Re: TListBox - Eintrag makrieren (Fokus setzen?)
Delphi-Quellcode:
ListBox1.Selected[2]:=true;
|
Re: TListBox - Eintrag makrieren (Fokus setzen?)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Matze,
danke für die schnell Antwort! :-D Bei mir bringt das setzen von
Delphi-Quellcode:
keinen Erfolg. :?
MainForm.EditList.Selected[MainForm.EditList.ItemIndex + 1] := true;
Also er setzt einfach nicht den Fokus auf den entsprechenden Listen-Eintrag. :gruebel: Wie gesagt ich möchte gern, dass er den Eintrag nicht nur mit dem Fokus belegt (aber das auch!), sondern auch gleich auswählt (blau unterlegt). Ich gebe mal das Beispiel-Projekt mit. Vielleicht hast Du ja noch eine Idee(?). |
Re: TListBox - Eintrag makrieren (Fokus setzen?)
Selected ist dedacht für Listen mit MultiSelect
in Deiner Liste setze einfach EditList.ItemIndex auf den gewünschten Index Bernd BTW: Gewöhn Dir dieses MainForm.Irgendwas.Eigenschaft in Formularmethoden ab, das ist logisch falsch :!: Wenn Du es weglässt, so zum Beispiel
Delphi-Quellcode:
wirst Du feststellen, dass es auch ohne geht, solange es sich um Formularmethoden handelt
// -- nach oben bewegen --
procedure TMainForm.UpButtonClick(Sender: TObject); begin if EditList.ItemIndex > 0 then EditList.Items.Move(EditList.ItemIndex, EditList.ItemIndex - 1); EditList.SetFocus; end; [edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit] |
Re: TListBox - Eintrag makrieren (Fokus setzen?)
Hmmm - uff! Ich drück mich einfach mal nicht richtig aus - oder?
Also die Liste wird ordentlich bearbeitet. Das ist nicht das Problem. Schieben geht wie es soll, einfügen geht - die Liste ist perfekt. Das Ziel ist ein bedienerfreundlicheres Arbeiten. Beim nach oben schieben klappt es fast richtig. Beleuchten wir das nochmal genauer: ![]() so sieht es aus, wenn die ListBox den Focus hat man bemerke: Eintrag ist NICHT selektiert (in dem Sinn wie ich es meine)! ![]() so sollte es aussehen: der Eintrag ist jetzt selektiert --------------------- Und damit es jeder wirklich erkennen kann hier was bei MoveUp passiert: ![]() vor dem MoveUp ist der Eintrag selektiert ![]() nach dem MoveUp ist der Eintrag nach oben gerutscht. Der Rahmen um den Eintrag ist mit nach oben gewandert. Und es ist NICHT mehr markiert! (das will ich ändern!) --------------------- Hier was bei MoveDown passiert: ![]() vor dem MoveDown ist der Eintrag selektiert ![]() nach dem MoveDown ist der Eintrag nach unten gerutscht. Der Rahmen um den Eintrag ist nach OBEN??? gewandert (er sollte runter!). Und es ist NICHT mehr markiert! (der Rahmen soll nach unten und der Eintrag markiert sein) Um es gleich zu sagen, warum ich den Listeneintrag markiert haben möchte: Mehrfachschiebung durch mehrmaliges Button klicken. Sprich ich schiebe ein Element nach unten um es gleich nochmal nach unten schieben zu können. So - ich hoffe mal jetzt ist klar was ich möchte. Sorry wegen der superlangen Message und den Bildern - ich will nur sicher gehen, das Problem ist klar geworden. Zitat:
Hmm, also ich seh da keinen den Unterschied. Ich sage dem Delphi da was, was es schon weiß. Mehr nicht. Falsch ist es nicht wirklich, wie ich finde. Weil mal angenommen, ich habe ein zweites Formular, welches auf eine ListBox vom anderen Formular zugreifen möchte, dann muß ich dem doch auch sagen wo das ist (nämlich auf dem anderen Formular). Wenn ich mehrere Formulare hätte, die jeweils eine (verschiedene) ListBox enthalten, dann ist es einfach mal nötig das zu unterscheiden. Und wenn es, wie in diesem Fall - sicher nicht nötig ist, dann kann ich das weglassen. Stimmt. Aber falsch sein kann es meiner Meinung nach auch nicht. Oder? Ich bin wirklich kein Profi und beschäftige mich noch nicht sehr lange mit Delphi. Aber wenn mir was nicht einleuchtet drängle ich gerne auf eine Erklärung, die ich auch verstanden habe. :? Danke trotzdem für die Antworten. |
Re: TListBox - Eintrag makrieren (Fokus setzen?)
Moin Bombjack,
das Problem ist, dass ItemIndex nach dem Move auf -1 steht. Mit Single Step und Anzeigen lassen der Werte kannst Du Dir das mal anschauen. Wenn nun also ein Item verschoben werden soll, musst Du Dir einfach den aktuellen ItemIndex in einer Hilfsvariablen merken und nach dem Verschieben ItemIndex auf den neuen Wert setzen. |
Re: TListBox - Eintrag makrieren (Fokus setzen?)
Zitat:
Nein ! Du probierts einfach nicht die Vorschläge aus, die du bekommst! :wall: Wenn Du das mit dem Itemindex in dein "Programm" einbaust funktioniert es so wie Du willst
Delphi-Quellcode:
procedure TMainForm.UpButtonClick(Sender: TObject);
var i : Integer; begin if EditList.ItemIndex > 0 then begin i := EditList.ItemIndex; EditList.Items.Move(i, i-1); EditList.SetFocus; EditList.ItemIndex := i-1; end; end; procedure TMainForm.DownButtonClick(Sender: TObject); var x,y: Integer; tstr: string; begin x:= EditList.ItemIndex; y:= EditList.Items.Count; str(x, tstr); TempLabel.Caption:= tstr; try if (x < (y - 1)) and (y > 1 ) then EditList.Items.Move(x, x + 1); except end; EditList.SetFocus; EditList.ItemIndex := x + 1;// := true; end; Zitat:
Die Logik Deines Programms, soweit man überhaupt schon davon sprechen kann ist : Verschiebe den Eintrag auf dem aktuellen Formular wo der Button ist. Du codest aber: Verschiebe den Eintrag auf dem Formular, das in der globalen Variable MainForm steht. Fügt doch mal spasseshalber einen Button Test zu, mit folgenden Code:
Delphi-Quellcode:
Und nun schau Dir dein Programmverhalten an, wenn Du MainForm verwendest.
with TFormMain.Create(nil) do
begin Left := Left + Width; Show; end; Macht das Verhalten Sinn ? Nein! Solltest Du dies Formular irgendwo wiederverwenden wollen oder den Code musst Du ausserdem völlig unnötige Änderungen vornehmen, die dir der Compiler zudem nicht anzeigt, wenn irgendwo ein MainForm durch die uses-Anweisung bekannt ist. Also weder logisch , noch wartbar, noch änderungsfreundlich und deshalb: einfach falsch Bernd [edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit] |
Re: TListBox - Eintrag makrieren (Fokus setzen?)
Zitat:
Danke für deine Hilfe. Jetzt bin ich schlauer und was deinen Tip mit dem MainForm.Irgendwas angeht, verstehe ich jetzt auch was du meinst. Gutes Beispiel btw. Danke! :D Zitat:
Dennoch denke ich du solltest das nicht so verbissen sehen. Ich stelle Fragen weil ich es nicht weiß. Und wenn man was nicht kennt, dann macht man auch Fehler. Also sei nicht gleich so angespannt, nur weil man etwas nicht gleich verstanden hat oder einfach übersehen. Du arbeitest doch viel mit Menschen, da sollte es dir klar sein, daß auch mal 'blöde' Fragen aufkommen. Dass man mal was übersieht kann doch nun wirklich jedem passieren oder? Danke auch an Chris. Damit ist auch geklärt warum ich eine Exception bekommen habe. Damit fällt das try...except weg. :) Damit ist nun die Frage aber bestens von euch beantwortet worden. :dp: |
Re: TListBox - Eintrag makrieren (Fokus setzen?)
Zitat:
dagegen ist dieser süsse Headbänger hier : :wall: harmlos Zitat:
bernd |
Re: TListBox - Eintrag makrieren (Fokus setzen?)
Na dann bin ich ja beruhigt. :cheers:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz