Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TListBox - Eintrag makrieren (Fokus setzen?) (https://www.delphipraxis.net/11886-tlistbox-eintrag-makrieren-fokus-setzen.html)

bombjack 16. Nov 2003 09:06


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:
// -- 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;
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:

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:

Matze 16. Nov 2003 09:08

Re: TListBox - Eintrag makrieren (Fokus setzen?)
 
Delphi-Quellcode:
ListBox1.Selected[2]:=true;

bombjack 16. Nov 2003 09:35

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:
MainForm.EditList.Selected[MainForm.EditList.ItemIndex + 1] := true;
keinen Erfolg. :?

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(?).

Bernd Ua 16. Nov 2003 09:55

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:
// -- 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;
wirst Du feststellen, dass es auch ohne geht, solange es sich um Formularmethoden handelt

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

bombjack 16. Nov 2003 12:56

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:


http://www.szene-junkie.de/pic/bild01.jpg
so sieht es aus, wenn die ListBox den Focus hat
man bemerke: Eintrag ist NICHT selektiert (in dem Sinn wie ich es meine)!


http://www.szene-junkie.de/pic/bild02.jpg
so sollte es aussehen: der Eintrag ist jetzt selektiert

---------------------

Und damit es jeder wirklich erkennen kann hier was bei MoveUp passiert:

http://www.szene-junkie.de/pic/bild03.jpg
vor dem MoveUp ist der Eintrag selektiert

http://www.szene-junkie.de/pic/bild04.jpg
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:

http://www.szene-junkie.de/pic/bild05.jpg
vor dem MoveDown ist der Eintrag selektiert

http://www.szene-junkie.de/pic/bild06.jpg
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:

>> Bernd: BTW: Gewöhn Dir dieses MainForm.Irgendwas.Eigenschaft in Formularmethoden ab, das ist logisch falsch!
:gruebel:
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.

Christian Seehase 16. Nov 2003 13:23

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.

Bernd Ua 16. Nov 2003 13:24

Re: TListBox - Eintrag makrieren (Fokus setzen?)
 
Zitat:

Hmmm - uff! Ich drück mich einfach mal nicht richtig aus - oder?

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:

Falsch ist es nicht wirklich, wie ich finde.
Doch.
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:
with TFormMain.Create(nil) do
  begin
    Left := Left + Width;
    Show;
  end;
Und nun schau Dir dein Programmverhalten an, wenn Du MainForm verwendest.
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]

bombjack 16. Nov 2003 14:24

Re: TListBox - Eintrag makrieren (Fokus setzen?)
 
Zitat:

Zitat von Bernd Ua
Nein ! Du probierts einfach nicht die Vorschläge aus, die du bekommst! :wall:

Hmm - was soll ich sagen. Du hst ja recht. Ich habe es überflogen und das wichtigste übersehen. Sorry! :?

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:

Zitat von Bernd Ua
Doch.
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.

...

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

So gesehen hast Du recht. An die Wiederverwendbarkeit von dem Quellcode habe ich sicher nicht gedacht, weil ich dieses Programm nur zu Testzwecken erstelle und damit lernen will wie es geht - bzw. gehen sollte. Ich lerne das halt noch Stück für Stück. Es hat funktioniert. Aber das es nicht richtig ist leuchtet mir jetzt auch ein.

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:

Bernd Ua 16. Nov 2003 14:37

Re: TListBox - Eintrag makrieren (Fokus setzen?)
 
Zitat:

Dennoch denke ich du solltest das nicht so verbissen sehen.
Du kennst mich nicht, wenn ich verbissen bin :lol:

dagegen ist dieser süsse Headbänger hier : :wall: harmlos

Zitat:

Du arbeitest doch viel mit Menschen, da sollte es dir klar sein, daß auch mal 'blöde' Fragen aufkommen.
Bei Trainings bin ich da auch nachsichtiger als hier <bg>

bernd

bombjack 16. Nov 2003 15:43

Re: TListBox - Eintrag makrieren (Fokus setzen?)
 
Na dann bin ich ja beruhigt. :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:08 Uhr.

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