![]() |
selbsterstellte Combobox hat (noch) keinere Fehler
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe eine Combobox mit folgenden Eigenschaften geschrieben:
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 |
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 |
AW: selbsterstellte Combobox hat (noch) keinere Fehler
Liste der Anhänge anzeigen (Anzahl: 1)
@Alaitoc:
Das verstehe ich nicht ganz: Zitat:
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:
auf .OnDeactivate gesetzt.
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; Hier nochmal ein Bild um das andere Problem zu verdeutlichen. Bei aufgeklapptem Grid ist das Formular "inaktiv". Das ist bei dir nicht der Fall? |
AW: selbsterstellte Combobox hat (noch) keinere Fehler
*push*
|
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:
Dieses Event ( wenn du es in eine Komponente einbaust ) wird immer ausgelöst, wenn die Komponente auf irgendeine Art den Focus verliert.
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; MfG Alaitoc |
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 |
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 |
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 ;) ( ![]() |
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 |
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 08:26 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