![]() |
Popupmenu in Listbox!! Repaint beim schließen!
Hallo,
ich habe eine ListBox mit mehreren einträgen, der ich mit der Drawitem-Procedure Icons vor jeden eintrag zeichne. Das klappt so weit sehr gut. Jetzt habe ich allerdings für das ereignis rechte-mause-down über einem Eintrag ein popupmenu hinzugefügt.
Code:
Klappt auch noch alles wunderbar.
procedure TForm3.tlbGamesMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var cursorpos : TPoint; ndx : integer; begin if Button=mbRight then begin cursorpos.X := X; cursorpos.Y := y; ndx := tlbGames.ItemAtPos(cursorpos,true); // Item unter dem Cursor if (ndx <> -1) then begin with (Sender As TListBox) do begin Selected[ndx] := True; cursorpos := ClientToScreen(cursorpos); // Positionsanpassung PopMenu1.Popup(cursorpos.x + Left,cursorpos.Y + Top); end; end; end; end; Doch wenn ich jetzt rechts auf einen eintrag in meiner box klicke und dann neben das popupmenu, so dass sich diese wieder schließt, sind meine Einträge in der Listbox über denen das popup gezeichnet war weg. Erst durch anklicken mit der linken Maustaste werden sie wieder sichtbar(neu gezeichnet) Wenn ich jetzt abfragen könnte wann das popupmenu geschlossen wird könnte ich mit
Code:
die Listbox neu zeichnen lassen.
tlbGames.repaint //<----ListBox neu zeichnen!!
Aber wie mach ich das??? Oder weiß jemand ne andere Lösung?? Hab die verschiedenen Threads zum Thema Popupmenu onclose, usw. schon gelesen. Bloß werd ich daraus nicht schlau!! Danke |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Hallo Sillium,
warum weist du dein Kontextmenü nicht direkt der Eigenschaft TListBox.PopupMenu zu? Bei mir wird nach dem Schließen des Kontextmenüs die Listbox im OnDrawItem korrekt und selbständig neu gezeichnet. Grüße vom marabu |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Muß ich mal ausprobieren.
Danke soweit!! Meld mich bei weiteren Fragen!! |
Re: Popupmenu in Listbox!! Repaint beim schließen!
So ich hab jetzt selbst eine Lösung gefunden!!
Und zwar habe ich mein OnMouseDown Ereigniss (siehe alter Code oben) nur eine bischen abgeändert.
Delphi-Quellcode:
Wäre trotzdem an einer Lösung interessiert, die mir das Popupmenu.onClose Ereignis mitteilt!
procedure TForm3.tlbGamesMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); var cursorpos : TPoint; ndx : integer; begin if Button=mbRight then begin cursorpos.X := X; cursorpos.Y := y; ndx := tlbGames.ItemAtPos(cursorpos,true); // Item unter dem Cursor if (ndx <> -1) then begin with (Sender As TListBox) do begin Selected[ndx] := True; cursorpos := ClientToScreen(cursorpos); // Positionsanpassung PopMenu1.Popup(cursorpos.x + Left,cursorpos.Y + Top); end; end; tlbGames.Repaint ; //<------Das hier ist neu und zeichnet meine Listbox beim end; //schließen meines Popupmenus! end; |
Re: Popupmenu in Listbox!! Repaint beim schließen!
|
Re: Popupmenu in Listbox!! Repaint beim schließen!
Hai ihr,
Zitat:
Jetzt habe ich aber gerad bemerkt das dies auch kürzer geht: (im .OnContextPopup Ereignis)
Delphi-Quellcode:
Dabei ist das PopupMenu ganz normal mit der TListBox verknüpft.
procedure TForm1.ListBox1ContextPopup(Sender: TObject; MousePos: TPoint;
var Handled: boolean); var aktItemIndex: integer; begin with (Sender as TListBox) do begin aktItemIndex := ItemAtPos(MousePos, True); if (aktItemIndex = -1) then begin Handled := True; end else begin ItemIndex := aktItemIndex; Handled := False; end; end; end; @Sillium: Was ich nicht verstehe ist warum deine ListBox nicht neu gezeichnet wird. Bei mir funktioniert das (egal mit welchem Code ich das Popup öffne) ohne Probleme. |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Danke!
Weis ich auch nicht! Vielleicht, weil ich ne andere popupkomponete als das standart popup benutze! Hier is meine DrawItem prozedur:
Delphi-Quellcode:
procedure TForm3.tlbSettingsDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState); var Icon2: Ticon; Icon3: Ticon; TopDif: Integer; // Gleicht die Höhendifferenz aus begin Icon2:= Ticon.Create ; Icon2.Transparent := True; Icon3:= Ticon.Create ; Icon3.Transparent := True; checkIcon(Icon2, icon3,Control, Index); with (Control as TListbox) do begin if odSelected in State then //Prüft, ob ein Item markiert ist begin Canvas.Brush.Color := RGB(196,188,80); //Canvas-Hintergrundfarbe setzen Canvas.FillRect(Rect); // Hintergrund malen Canvas.TextOut(Rect.Left + 6, Rect.Top + 6, Items[Index]); // Text ausgeben end; Canvas.Font.Color:=clWhite; TopDif := (ItemHeight div 2) - (Canvas.TextHeight(#32) div 2); Canvas.TextRect(Rect, Rect.Left + Icon2.Width + 8, Rect.Top + TopDif, Items[Index]); Canvas.FrameRect(Rect); Canvas.Draw(Rect.Left, Rect.Top, Icon2); end; end; |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Delphi-Quellcode:
Du gibst den Text nur aus wenn das Item den Focus hat? Ist das absicht?
.
if odSelected in State then //Prüft, ob ein Item markiert ist begin Canvas.Brush.Color := RGB(196,188,80); //Canvas-Hintergrundfarbe setzen Canvas.FillRect(Rect); // Hintergrund malen Canvas.TextOut(Rect.Left + 6, Rect.Top + 6, Items[Index]); // Text ausgeben end; Hänge doch mal ein Bild an wie das ganze aussehen soll. |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Delphi-Quellcode:
Ich hab gedacht das Zeichnet mir den Text in mein Rect.......
Canvas.TextRect(Rect, Rect.Left + Icon2.Width + 8, Rect.Top + TopDif, Items[Index]);
Wenn ich aber
Delphi-Quellcode:
das hier benutze, funktioniert es.
Canvas.TextOut(Rect.Left + Icon2.Width + 8, Rect.Top + TopDif, Items[Index]);
Danke! Is echt hgeil wie schnell hier geholfen wird!! |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Mist!!
Zu schnell geantwortet! Damit hab ich das gleiche Problem! |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Kannst Du dein Projekt mal anhängen? Oder ist das zu komplex?
|
Re: Popupmenu in Listbox!! Repaint beim schließen!
Zu komplex!
Aber du kennst ja meine Draw-Item Prozedur und meine PopUp-Prozedur. Die andere kürzere Version von Dir habe ich noch nicht ausprobiert! |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Zitat:
Ausserdem wäre es schön mal einen Scrennshot zu sehen wie es deiner Meinung nach aussehen sollte ;-) Dann bekommen wir das sicher in den Griff. |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich schreibe mir ein Programm in der Art von Steam, von dem aus ich Alle meine spiele starten kann, server suchen und starten und diverse Einstellungen machen kann.
Bis jetzt sucht dass Programm nur nach meinen installierten Valve Spiele. (siehe Screenshot) Hier ist noch die Prozedur, die mir meine Icons auswählt!
Delphi-Quellcode:
In meine Settings kommt dann eine Auswahl, welche Icons benutzt werden sollen. deswegen hier die zwei Icons.
{*****************************************************************************
Funktion, die meinem Listeneinträgen die richtigen Icons zuordnet ******************************************************************************} procedure TForm3.checkIcon(var Icon:TIcon; var Icon1:TIcon; Control: TWinControl; Index: Integer); begin Icon:= Ticon.Create ; with (Control as TListbox) do begin If Items[Index] = 'Half-Life' then begin Icon.Handle := ExtractIcon(Hinstance, 'EightIc.dll', 8); Icon1.Handle := ExtractIcon(Hinstance, 'EightIc.dll', 34); end; If Items[Index] = 'Counter-Strike 1.6' then begin Icon.Handle := ExtractIcon(Hinstance, 'EightIc.dll', 2); Icon1.Handle := ExtractIcon(Hinstance, 'EightIc.dll', 27); end; end; Und die Prozedur habe ich geschrieben, weil ich in allen Vier Listen (Games, Settings,.....) die Icons brauch!! Und jetzt ist es eben so, dass manchmal, wenn sich mein Popupmenu schließt, die hälfte des Intrages in der Liste weg ist. oder nur das Icon weg ist. Wenn ich wie oben, das Repaint mit in mein Mousedown ereignis einbinde ist das zwar nicht mehr der fall, aber jedesmal, wenn ich einen Eintrag anklicke "blitzt" die liste kurz. |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Hai Sillium,
was ist das denn für eine Komponente die Du da verwendest? (Die mit diesem "Outlook-Style"). Hast Du den Code denn schon einmal mit einer ListBox auf einer "normalen" TForm versucht? Nicht das wir uns den Wolf suchen und der Fehler durch diese dritt Kompo verursacht wird ;-) |
Re: Popupmenu in Listbox!! Repaint beim schließen!
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
ich benutze eine Komponente, die TransparentListBox heißt. Das Panel im Outlookstyle ist von Jedi!! Ich häng dir mal die TransparentListBox an. Wäre net, wenn du mal schauen könntest, ob du da was findest! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 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