AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi in DBGrid-Celle dargestelle Listbox wieder unsichtbar machen
Thema durchsuchen
Ansicht
Themen-Optionen

in DBGrid-Celle dargestelle Listbox wieder unsichtbar machen

Ein Thema von karsten.kg · begonnen am 10. Jul 2009 · letzter Beitrag vom 12. Jul 2009
Antwort Antwort
karsten.kg

Registriert seit: 28. Jun 2009
7 Beiträge
 
#1

in DBGrid-Celle dargestelle Listbox wieder unsichtbar machen

  Alt 10. Jul 2009, 19:20
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:
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;
Durch diesen Code öffnet sich eine Listbox in der Zelle des DBStringGrids!

Ich möchte jetzt aber erreichen, das die Listbox wieder verschwindet, wenn ich außerhalb des Grid irgendwohin Klicke! Aber wie??

Danke und Gruß


Karsten
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma

  Alt 10. Jul 2009, 19:29
Im Event OnExit einfach lbBuchungsliste.Visible := False setzen.
fork me on Github
  Mit Zitat antworten Zitat
karsten.kg

Registriert seit: 28. Jun 2009
7 Beiträge
 
#3

Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma

  Alt 10. Jul 2009, 19:49
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
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#4

Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma

  Alt 11. Jul 2009, 00:36
Zitat von karsten.kg:
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
Hallo Karsten,

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
  Mit Zitat antworten Zitat
karsten.kg

Registriert seit: 28. Jun 2009
7 Beiträge
 
#5

Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma

  Alt 11. Jul 2009, 12:46
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
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#6

Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma

  Alt 11. Jul 2009, 14:32
Zitat von karsten.kg:
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
Hallo,

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
  Mit Zitat antworten Zitat
karsten.kg

Registriert seit: 28. Jun 2009
7 Beiträge
 
#7

Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma

  Alt 11. Jul 2009, 23:17
Hallo,

hab jetzt mit dem Application.OnMessage Event gearbeitet:

Delphi-Quellcode:
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;
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.

Gruß Karsten
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#8

Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma

  Alt 12. Jul 2009, 00:50
Hallo,

auf der Fensterleiste usw. heisst die Message ja auch WM_NCLBUTTONDOWN.

Gruss Reinhard
  Mit Zitat antworten Zitat
karsten.kg

Registriert seit: 28. Jun 2009
7 Beiträge
 
#9

Re: in DBGrid-Celle dargestelle Listbox wieder unsichtbar ma

  Alt 12. Jul 2009, 14:22
Hallo Reinhard,

NC bedeutet "Non Client" 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:
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;
Also es funktioniert nun einwandfrei - zumindest so, wie ich es wollte!

Gruß Karsten
  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 23: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