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/)
-   -   GetItemAtPos macht bei Listbox manchmal probleme (https://www.delphipraxis.net/185905-getitematpos-macht-bei-listbox-manchmal-probleme.html)

leonreiser 16. Jul 2015 14:56

GetItemAtPos macht bei Listbox manchmal probleme
 
Hi Leute.
Ich habe ein Problem mit einem Abschnitt in meinem Programm.
Dieser Abschnitt soll bei einem Rechtklick auf ein Item in meiner ListBox, den Text
des entsprechenden Items ändern. Das klappt auch, aber nur manchmal. Wenn ich z.B. neue
Elemente zu der listbox hinzufüge, dann passiert es manchmal dass die letzten 1-3 Einträge
nichtmehr klickbar sind. Ich realisiere das ganze mit ItemAtPos() was mir dann bei diesen Einträgen
den Index -1 zeigt. Daneben habe ich auch nicht geklickt, da bin ich mir sicher. Ich habe auch bis jetzt
noch nicht herausgefunden wie ich den Fehler zuverlässig reproduzieren kann. Manchmal klappt alles.
Aber hier erstmal der Code:
Delphi-Quellcode:
procedure TForm2.ListBox2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
cursorpos : TPoint;
ItmIndx : integer;
begin
  Label1.Caption := ListBox2.Items[ListBox2.COunt-1];
  if Button=mbRight then
  begin
    cursorpos.X := X;
    cursorpos.Y := y;
    ItmIndx := 0;
    ItmIndx := ListBox1.ItemAtPos(cursorpos,true);
    if ItmIndx = -1 then begin
    end
      //vl Fokus setzen weil er durch ungültige Position verloren geht??
    else begin
      ListBox2.ItemIndex := ItmIndx;
      try
      if AnsiLastChar(ListBox2.Items[ItmIndx]) = '▲' then begin
        ListBox2.Items[ItmIndx] := StringReplace(ListBox2.Items[ItmIndx], '▲', '▼',[rfReplaceAll, rfIgnoreCase]);
      end
      else if AnsiLastChar(ListBox2.Items[ItmIndx]) = '▼' then begin
        ListBox2.Items[ItmIndx] := StringReplace(ListBox2.Items[ItmIndx], '▼','▲',[rfReplaceAll , rfIgnoreCase]);
      end;
      except
      end;
    end;
  end;
end;
So der Code wär vl. auch eleganter möglich gewesen, aber mir geht es ja zurzeit ertmal um den Bugfix.
Die Ästhetik muss sich noch gedulden.
Dann hoffe ich mal dass mir jemand helfen kann.
Bin neu hier im Forum, also wenn ich was an der Art meiner Fragestellung ändern soll, gerne bescheid sagen.
Danke schonmal

leonreiser 16. Jul 2015 15:01

AW: GetItemAtPos macht bei Listbox manchmal probleme
 
Oh mir ist gerade aufgefallen dass ich das thema in einen völlig Falsche Kategorie hab. Kann man das einfach verschieben?

Union 16. Jul 2015 15:03

AW: GetItemAtPos macht bei Listbox manchmal probleme
 
Kannst Du evtl. entweder ein Projekt oder wenigstens eine Setup-Routine zum Füllen der Listbox posten?

leonreiser 16. Jul 2015 15:07

AW: GetItemAtPos macht bei Listbox manchmal probleme
 
Natürlich. Also hier hab ich noch die zwei Routinen für das Füllen und leeren. Dabei soll man sozusagen mit einem Klick auf ein Item jenes in die jeweils andere
Listbox schreiben:
Delphi-Quellcode:
procedure TForm2.ListBox1Click(Sender: TObject);
var
I :Integer;
begin
  for I := 0 to ListBox1.Count-1 do
    if ListBox1.Selected[I] = True then begin
        ListBox2.Items.Add(ListBox1.Items[I] + ' ▼');

       ListBox1.Items.Delete(I);
        break;
    end;
    ListBox1.Height := 16 * ListBox1.Count; // geschmackssache
    ListBox2.Height := 16 * ListBox2.Count; // geschmackssache

end;

procedure TForm2.ListBox2Click(Sender: TObject);
var
I :Integer;
begin
  for I := 0 to ListBox2.Count-1 do
    if ListBox2.Selected[I] = True then begin
      //  SortType[I] := Null;
      ListBox2.Items[I] := StringReplace(ListBox2.Items[I], ' ▼','',[rfReplaceAll , rfIgnoreCase]);
      ListBox2.Items[I] := StringReplace(ListBox2.Items[I], ' ▲','',[rfReplaceAll , rfIgnoreCase]);
        ListBox1.Items.Add(ListBox2.Items[I]);
        ListBox2.Items.Delete(I);
        break;
    end;
  ListBox1.Height := 16 * ListBox1.Count; // geschmackssache
    ListBox2.Height := 16 * ListBox2.Count;  // geschmackssache
end;

leonreiser 10. Aug 2015 10:49

AW: GetItemAtPos macht bei Listbox manchmal probleme
 
Übrigens falls es jemanden interessiert, ich habe es nun einfach mit ListViews gemacht, da kann ich dann auch noch
Icons reinmachen und muss nicht unbedingt die blöden Sonderzeichen
als Zeile verwenden. Code dazu ist überall online aber wer ihn will solls einfach sagn, dann such ich ihn raus.
Ich weis übrigens immernoch nicht wie man eingene Threads im Forum löscht oder als geschlossen markiert.
Wenn jmd nen Tipp hätte wärs nich schlecht.
Ist warscheinlich ziemlich leicht und ich stell mich einfach blöd an.

Sir Rufo 10. Aug 2015 11:18

AW: GetItemAtPos macht bei Listbox manchmal probleme
 
Löschen wäre ja doof, denn dann hätte niemand etwas davon, der in Zukunft das gleiche/ähnliche Problem hat.

Jedes mal, wenn du antwortest, gibt es unter dem Editor eine CheckBox mit dem Text:
Zitat:

Dieses Thema als offene Frage markieren


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 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