Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Delphi selbsterstellte Combobox hat (noch) keinere Fehler (https://www.delphipraxis.net/151995-selbsterstellte-combobox-hat-noch-keinere-fehler.html)

David Martens 8. Jun 2010 13:21


selbsterstellte Combobox hat (noch) keinere Fehler
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe eine Combobox mit folgenden Eigenschaften geschrieben:
  • mehrspaltig
  • Mehrfachauswahl möglich
  • Schnellsuche
  • Intervallsuche
  • Spaltensortierung
  • Sortierung mit eigenen Routinen möglich
  • Spaltenüberschriften möglich
  • ...

Die Komponente ist abgeleitet von TCustomPanel und das Dropdownmenü wird realisiert über eine TForm auf der ein StringGrid liegt.
Funktionieren tut alles soweit aber es gibt zwei kleinere Probleme:

1. Durch die Form wird das Programmfenster inaktiv wenn es aufgeht.
2. Das Grid ist manchmal über anderen Fenstern/Programmen zu sehen, da der FormStyle StayOnTop ist um das Menü über die Taskleiste zu bekommen.


Vielen Dank, David
Anhang 31290

Alaitoc 8. Jun 2010 13:50

AW: selbsterstellte Combobox hat (noch) keinere Fehler
 
Also ich habe ebenfalls meine eigene Combobox-Komponente über ein Formular
realisiert was ich aufrufe, wobei ich dort den Parent auf den Desktop lege.

Wenn ich dann mit der Maus außerhalb des Fensters ist, setzte ich SetCapture() um
den Mausclick abzufangen und das Formular zu schließen und wenn die Maus innerhalb des
Formulars liegt benutze ich ReleaseCapture() damit man normal mit dem Formular und mit dem was
dort draufliegt arbeiten kann.

Zusätzlich wird das Fenster geschlossen, wenn der Focus verloren geht ( bei z.b. Alt+Tab ).

Bisher habe ich zumindest keine Anomalitäten bei meinem Vorgehen feststellen können und leider ist mir bisher keine andere Möglichkeit ohne SetCapture() und ReleaseCapture() bekannt. :?

Zumindest sieht sie so 100% wie eine Standard-Combobox aus und funktioniert bisher auch genauso ;) ... abgesehen von dem Treeview innerhalb des aufpoppenden Fensters.

MfG Alaitoc

David Martens 8. Jun 2010 14:40

AW: selbsterstellte Combobox hat (noch) keinere Fehler
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Alaitoc:

Das verstehe ich nicht ganz:
Zitat:

wobei ich dort den Parent auf den Desktop lege
Ich habe den Parent garnicht gesetzt.

Ich habe insgesamt drei Formulare, da die beiden Suchboxen auch welche sind, die aber neben den Grid stehen.
Bei allen drei Formularen habe ich einfach
Delphi-Quellcode:
procedure TMultiColCheckedComboBox.OnSearchFocusLost(Sender: TObject);
var
  wnd : HWND;
begin
  (Sender as TForm).Close;
  FGrid.Options := FGrid.Options - [goRangeSelect];

  wnd := WindowFromPoint(mouse.CursorPos);

  if (FPrivForm.Visible) and (wnd <> FGrid.Handle) then
  begin
    FPrivForm.Close;
  end;
end;
auf .OnDeactivate gesetzt.


Hier nochmal ein Bild um das andere Problem zu verdeutlichen.
Bei aufgeklapptem Grid ist das Formular "inaktiv".
Das ist bei dir nicht der Fall?

David Martens 14. Jun 2010 14:05

AW: selbsterstellte Combobox hat (noch) keinere Fehler
 
*push*

Alaitoc 14. Jun 2010 14:41

AW: selbsterstellte Combobox hat (noch) keinere Fehler
 
Sorry, hatte vergessen mir den Beitrag zu den Favoriten hinzufügen und somit leider etwas verdrängt.

Also ich gehe davon aus das du das Formular per .Show() anzeigst und es hat den Formstyle fsStayOnTop, nicht wahr?

Ich habe es halt in dem Fall völlig anders gelöst, indem ich das Formular auf den Desktop anzeige und es so modifziere das es nicht den Focus klaut. (Per Windows-API Funktionen )
Per SetCapture() und ReleaseCapture() fange ich halt noch ab ob der Benutzer woanders hinkliegt und per OnFocusLost-Event ( eine extra Windows-Message ) überprüfe ich ob die Komponente den Focus verliert.

Da du ja sozusagen mit der VCL arbeitest und du ein neues Formular mit Gridview erzeugst kriegt das halt den Focus, da ist es selbstverständlich das das andere Formular den Focus verliert.
Das Problem,dass das Formular über anderen Fenster und so weiter hängt darf eigentlich gar nicht vorhanden sein. Zumindest in meiner Auffassung schließt sich eine Combobox automatisch wenn sie nicht mehr vorne ist. ( D.h. den Focus verloren hat oder sonstiges )

Also im Endeffekt kenn ich dabei leider keinen Weg mit der VCL zu arbeiten, abgesehen vll. mit TCustomCombobox zu arbeiten.

Vll. hilft dir aber trotzdem noch der Codeauszug weiter:
Delphi-Quellcode:
  private
    FFocusLostEvent: TNotifyEvent;
    procedure WMKillFocus( var Message: TWMKillFocus ); message WM_KILLFOCUS;

  published
    property OnFocusLost: TNotifyEvent read FFocusLostEvent write FFocusLostEvent;

procedure X.WMKillFocus( var Message: TWMKillFocus );
begin
  inherited;
  if Assigned( FFocusLostEvent ) then
  begin
   OnFocusLost( Self );
  end;
end;
Dieses Event ( wenn du es in eine Komponente einbaust ) wird immer ausgelöst, wenn die Komponente auf irgendeine Art den Focus verliert.

MfG Alaitoc

David Martens 14. Jun 2010 15:04

AW: selbsterstellte Combobox hat (noch) keinere Fehler
 
@Alaitoc: Wunderbar ich danke dir. Ich hab es gleich mal ausprobiert und das scheint mein 2. Problem entlich zu lösen.

Kannst du mir mal zeigen wie du das mit den API-Funktionen gemacht hast? Damit hab ich leider noch nicht so viel gemacht.
Mit TCustomCombobox kann ich leider nciht arbeiten, da ich dann kein AOwner: TComponent habe den ich an das Grid weiterleiten kann.

Danke nochmal,
David

Alaitoc 14. Jun 2010 16:03

AW: selbsterstellte Combobox hat (noch) keinere Fehler
 
Da ich leider nun nicht mehr auf der Arbeit bin und das Projekt nicht hier habe
musst du dich leider noch bis Morgen gedulden.

Werde mich dann aber so früh wie möglich melden.

MfG Alaitoc

David Martens 14. Jun 2010 16:16

AW: selbsterstellte Combobox hat (noch) keinere Fehler
 
@Alaitoc: Danke dir, aber keine Hektik. Du hast mir schon super geholfen und so groß ist das Problem nun auch nicht, das ich das gleich morgen früh umsetzen muß.

Bis Dann, und hoffentlich konnte ich auch helfen ;) (http://www.delphipraxis.net/152162-m...-getrennt.html)

Alaitoc 15. Jun 2010 13:33

AW: selbsterstellte Combobox hat (noch) keinere Fehler
 
Puh ich finde es einfach nicht o.o , bin den Programmcode mehrfach durchgegangen...
Ich kann aber irgendwie die zuständige Zeile dafür nicht finden.

Wie rufst du denn das Formular wo das Gridview draufliegt auf?

MfG Alaitoc

David Martens 15. Jun 2010 16:37

AW: selbsterstellte Combobox hat (noch) keinere Fehler
 
So:

Delphi-Quellcode:
procedure TMultiColCheckedComboBox.DoDropDown(Sender : TObject);
var
  ScreenPoint : TPoint;
  i, j,
  FWidth,
  FHeight,
  FTop,
  FLeft : integer;
begin
  // damit das Suchfeld nicht unerwartet aufpoppt, wird es beim Zeigen der
  // CheckList immer auf unsichtbar geschaltet
  if FSearchForm.Visible then
  begin
    FSearchForm.Visible := false;
  end;

  if FMultiSearchForm.Visible then
  begin
    FMultiSearchForm.Visible := false;
  end;

  // Dropdownbutton
  if FButton.Tag = 1 then
  begin
    FButton.Tag := 0;
    if not FEdit.Focused then
      EditOnExit(Sender);
    Exit;
  end;

  Click;

  // Assign Form coordinate and show
  ScreenPoint          := Parent.ClientToScreen(Point(Self.Left, Self.Top + Self.Height));

  with FPrivForm do
  begin
    Visible      := false;
    FLeft        := ScreenPoint.X;
    FTop         := ScreenPoint.Y;
    FWidth       := 0;
    FHeight      := 0;

    // Gesamtbreite des Grids ermitteln
    ...
    // Aufklapphöhe ermitteln (keine leere Fläche in der DropDownBox)
    ...
    // Breite mindestend Komponentenbreite
    ...
    // Höhe auf Bildschirmgröße limitieren
    ...
    // Breite auf Bildschirmgröße limitieren
    ...

    BorderStyle := bsNone;
    OnDeactivate := DoCloseDropDown;

    // Box anzeigen
    Show;
    SetBounds(FLeft, FTop, FWidth, FHeight);
    FormStyle    := fsStayOnTop;      // über die Startleiste
    Font         := Self.Font;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:05 Uhr.
Seite 1 von 2  1 2      

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