AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TListBox - Eintrag makrieren (Fokus setzen?)

Ein Thema von bombjack · begonnen am 16. Nov 2003 · letzter Beitrag vom 16. Nov 2003
Antwort Antwort
bombjack

Registriert seit: 10. Nov 2003
Ort: Dresden
6 Beiträge
 
Delphi 5 Professional
 
#1

TListBox - Eintrag makrieren (Fokus setzen?)

  Alt 16. Nov 2003, 09:06
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?


Danke für Eure Hilfe schonmal!
Wenn Sie glauben, Sie hätten mich verstanden, dann habe ich mich falsch ausgedrückt!
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: TListBox - Eintrag makrieren (Fokus setzen?)

  Alt 16. Nov 2003, 09:08
ListBox1.Selected[2]:=true;
  Mit Zitat antworten Zitat
bombjack

Registriert seit: 10. Nov 2003
Ort: Dresden
6 Beiträge
 
Delphi 5 Professional
 
#3

Re: TListBox - Eintrag makrieren (Fokus setzen?)

  Alt 16. Nov 2003, 09:35
Hallo Matze,
danke für die schnell Antwort!


Bei mir bringt das setzen von

MainForm.EditList.Selected[MainForm.EditList.ItemIndex + 1] := true; keinen Erfolg.

Also er setzt einfach nicht den Fokus auf den entsprechenden Listen-Eintrag.

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(?).
Angehängte Dateien
Dateityp: zip dp_170.zip (9,3 KB, 9x aufgerufen)
Wenn Sie glauben, Sie hätten mich verstanden, dann habe ich mich falsch ausgedrückt!
  Mit Zitat antworten Zitat
Bernd Ua

Registriert seit: 10. Nov 2003
Ort: Lindhorst
87 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: TListBox - Eintrag makrieren (Fokus setzen?)

  Alt 16. Nov 2003, 09:55
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]
Bernd Ua
  Mit Zitat antworten Zitat
bombjack

Registriert seit: 10. Nov 2003
Ort: Dresden
6 Beiträge
 
Delphi 5 Professional
 
#5

Re: TListBox - Eintrag makrieren (Fokus setzen?)

  Alt 16. Nov 2003, 12:56
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!

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.
Wenn Sie glauben, Sie hätten mich verstanden, dann habe ich mich falsch ausgedrückt!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: TListBox - Eintrag makrieren (Fokus setzen?)

  Alt 16. Nov 2003, 13:23
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Bernd Ua

Registriert seit: 10. Nov 2003
Ort: Lindhorst
87 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: TListBox - Eintrag makrieren (Fokus setzen?)

  Alt 16. Nov 2003, 13:24
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!

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]
Bernd Ua
  Mit Zitat antworten Zitat
bombjack

Registriert seit: 10. Nov 2003
Ort: Dresden
6 Beiträge
 
Delphi 5 Professional
 
#8

Re: TListBox - Eintrag makrieren (Fokus setzen?)

  Alt 16. Nov 2003, 14:24
Zitat von Bernd Ua:
Nein ! Du probierts einfach nicht die Vorschläge aus, die du bekommst!
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!

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.
Wenn Sie glauben, Sie hätten mich verstanden, dann habe ich mich falsch ausgedrückt!
  Mit Zitat antworten Zitat
Bernd Ua

Registriert seit: 10. Nov 2003
Ort: Lindhorst
87 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: TListBox - Eintrag makrieren (Fokus setzen?)

  Alt 16. Nov 2003, 14:37
Zitat:
Dennoch denke ich du solltest das nicht so verbissen sehen.
Du kennst mich nicht, wenn ich verbissen bin

dagegen ist dieser süsse Headbänger hier : 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
Bernd Ua
  Mit Zitat antworten Zitat
bombjack

Registriert seit: 10. Nov 2003
Ort: Dresden
6 Beiträge
 
Delphi 5 Professional
 
#10

Re: TListBox - Eintrag makrieren (Fokus setzen?)

  Alt 16. Nov 2003, 15:43
Na dann bin ich ja beruhigt.
Wenn Sie glauben, Sie hätten mich verstanden, dann habe ich mich falsch ausgedrückt!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 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