AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi selbsterstellte Combobox hat (noch) keinere Fehler
Thema durchsuchen
Ansicht
Themen-Optionen

selbsterstellte Combobox hat (noch) keinere Fehler

Ein Thema von David Martens · begonnen am 8. Jun 2010 · letzter Beitrag vom 17. Jun 2010
Antwort Antwort
Seite 1 von 2  1 2      
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#1

selbsterstellte Combobox hat (noch) keinere Fehler

  Alt 8. Jun 2010, 13:21
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
Miniaturansicht angehängter Grafiken
bild.png  
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: selbsterstellte Combobox hat (noch) keinere Fehler

  Alt 8. Jun 2010, 13:50
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
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#3

AW: selbsterstellte Combobox hat (noch) keinere Fehler

  Alt 8. Jun 2010, 14:40
@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?
Miniaturansicht angehängter Grafiken
bild.png  
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#4

AW: selbsterstellte Combobox hat (noch) keinere Fehler

  Alt 14. Jun 2010, 14:05
*push*
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: selbsterstellte Combobox hat (noch) keinere Fehler

  Alt 14. Jun 2010, 14:41
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

Geändert von mkinzler (14. Jun 2010 um 16:17 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#6

AW: selbsterstellte Combobox hat (noch) keinere Fehler

  Alt 14. Jun 2010, 15:04
@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
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: selbsterstellte Combobox hat (noch) keinere Fehler

  Alt 14. Jun 2010, 16:03
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
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#8

AW: selbsterstellte Combobox hat (noch) keinere Fehler

  Alt 14. Jun 2010, 16:16
@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)
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: selbsterstellte Combobox hat (noch) keinere Fehler

  Alt 15. Jun 2010, 13:33
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
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#10

AW: selbsterstellte Combobox hat (noch) keinere Fehler

  Alt 15. Jun 2010, 16:37
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:41 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