![]() |
in DBGrid-Celle dargestelle Listbox wieder unsichtbar machen
Hallo,
ich habe mir von TDBGrid die Komponente TDBStringGrid abgeleitet, welche es mir erlaubt, auch das Ereignis OnSelectCell zu nutzen. Dieses benötige ich, um in einer Zelle des DBGrid z.B. eine Listbox darzustellen. Das ganze sieht so aus:
Delphi-Quellcode:
Durch diesen Code öffnet sich eine Listbox in der Zelle des DBStringGrids!
procedure TmdiBuchungsliste.setRectListBox(rec:Trect);
var r:TRect; begin // ListBox in DBStringGrid CopyRect(r,rec); // rec an r übergeben r.BottomRight:=lbBuchungsliste.Parent.ScreenToClient(dbsgBuchungsliste.ClientToScreen(r.BottomRight)); r.TopLeft:=lbBuchungsliste.Parent.ScreenToClient(dbsgBuchungsliste.ClientToScreen(r.TopLeft)); lbBuchungsliste.SetBounds(r.Left,r.Top+TDrawgrid(dbsgBuchungsliste).defaultrowheight,r.Right-r.Left,200); lbBuchungsliste.BringToFront; end; procedure TmdiBuchungsliste.dbsgBuchungslisteSelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin setrectListBox(dbsgBuchungsliste.cellrect(Acol,Arow)); lbBuchungsliste.visible:=true; lbBuchungsliste.setfocus; end; Ich möchte jetzt aber erreichen, das die Listbox wieder verschwindet, wenn ich außerhalb des Grid irgendwohin Klicke! Aber wie?? :gruebel: Danke und Gruß Karsten |
Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma
Im Event OnExit einfach lbBuchungsliste.Visible := False setzen.
|
Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma
Hallo sx2008,
so leicht ist das leider nicht: Das Ereignis on Exit wird nur ausgelöst, wenn ein anderes Steuerelement den Fokus bekommt. Ich habe im Formular auch eine Toolbar mit BitButtons! Wenn ich auf die Buttons klicke, funktioniert es natürlich. Wenn ich auf die Toolbar klicke, bekommt diese aber nicht den Fokus, weil Sie kein fensterorientiertes Steuerelement ist. Wenn ich im übergeordneten Fenster (MDI-Form) auf die Toolbar klicke, passiert auch nichts! Gibt es noch weitere Ideen? Danke und Gruß Karsten |
Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma
Zitat:
wärst du zufrieden, wenn es bei Fenstern aus dem gleichen Thread funktionieren würde? Ich glaube, systemweit geht es nicht ohne Hook, aber damit, dass ein Klick in ein ganz fremdes Fenster bei dir nichts am Zustand ändert, könnte man vielleicht leben. Gruss Reinhard |
Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma
Hallo Reinhard,
ja, ich wäre damit zufrieden. Ich kann mich ja später mal nach Lust und Laune mit Hooks beschäftigen. Den einzelnen Beiträgen hier im Forum zufolge ist es auch kein Hexenwerk. Wie bekomme ich es denn innerhalb der Anwendung hin? Gruß Karsten |
Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma
Zitat:
nur so eine Idee und noch dazu eine, die hier nicht gern gesehen ist, weil es sich nicht um eine VCL-Komponente handelt, sondern um direkte Win32-API: man kann laut SDK die Maus auch capturen, wenn sie nicht gedrückt ist, und bekommt dann Mausereignisse über allen Fenstern des gleichen Threads. Du könntest also, wenn irgendwo in deinen Fenstern geklickt wird (ausser in der Listbox selbst) die Maus releasen und die Listbox invisible machen. Ob das so glatt geht wie gedacht, musst du halt mal ausprobieren, ich habe das noch nicht getestet und weiss nicht, ob die Sache irgendwo einen Haken hat. Ich persönlich sehe sowas nicht als unsaubere Programmierung an, aber das musst du selbst entscheiden. Gruss Reinhard |
Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma
Hallo,
hab jetzt mit dem Application.OnMessage Event gearbeitet:
Delphi-Quellcode:
So ganz zufrieden bin ich mit der Lösung noch nicht, da das ganze nicht funktioniert, wenn ich auf das Hauptmenü bzw. die blaue Leiste darüber = Fensterleiste Klicke. Hier hilft wahrscheinlich wirklich nur ein Hook oder die Listbox wird in einem eigenem Formular dargestellt.
procedure TmdiBuchungsliste.FormCreate(Sender: TObject);
begin Application.OnMessage:=AppMessage; end; procedure TmdiBuchungsliste.AppMessage(var Msg: TMsg; var Handled: Boolean); begin if Msg.message = WM_LBUTTONDOWN then begin if not(ptInRect(lbBuchungsliste.boundsrect,lbBuchungsliste.parent.ScreenToClient(mouse.cursorpos))) then begin if not(ptInRect(dbsgBuchungsliste.cellrect(dbsgBuchungslisteCol,dbsgBuchungslisteRow), dbsgBuchungsliste.ScreenToClient(mouse.cursorpos))) then begin sendtoback; //eingelagerte Listbox unsichtbar machen end; end; Handled := false; end; end; Gruß Karsten |
Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma
Hallo,
auf der Fensterleiste usw. heisst die Message ja auch WM_NCLBUTTONDOWN. Gruss Reinhard |
Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma
Hallo Reinhard,
NC bedeutet "Non Client" :zwinker: man lernt halt nie aus. Danke. Hab ich jetzt mit eingebaut. Gleichzeitig muss ich eine zusätzlich Abfrage einbauen, ob das Formular noch aktiv ist. Denn wenn ich es schließe, funktioniert das OnMessage-Ereignis trotzdem noch - und wenn ich dann z.B. in den Non Client Bereich klicke, kommt es zu einer Access-Violation.
Delphi-Quellcode:
Also es funktioniert nun einwandfrei - zumindest so, wie ich es wollte! :mrgreen:
procedure TmdiBuchungsliste.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin if (Msg.message = WM_NCLBUTTONDOWN) or (Msg.message = WM_LBUTTONDOWN) then begin if active then //nur wenn Formular mdiBuchungsliste Aktiv begin //ScreenToClient für Formular mdiBuchungsliste if not(ptInRect(lbBuchungsliste.boundsrect,lbBuchungsliste.parent.ScreenToClient(mouse.cursorpos))) then begin if not(ptInRect(dbsgBuchungsliste.cellrect(dbsgBuchungslisteCol,dbsgBuchungslisteRow), dbsgBuchungsliste.ScreenToClient(mouse.cursorpos))) then begin sendtoback; //Listbox unsichtbar machen end; end; end; Handled := false; end; end; Gruß Karsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 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