AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Combobox mit Bitmaps

Ein Thema von Bomberbb · begonnen am 30. Nov 2007 · letzter Beitrag vom 30. Nov 2007
Antwort Antwort
Seite 2 von 2     12   
Muetze1
(Gast)

n/a Beiträge
 
#11

Re: Combobox mit Bitmaps

  Alt 30. Nov 2007, 14:12
Eine ComboBox ist nur eine Kombination aus einem Editfeld und einer Listbox (intern) und ich weiss nicht, ob er bei den Mousereignissen diese auch liefert, wenn er sich auf dem ListBoxbereich befindet. Aber das war hier nicht die Frage...
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#12

Re: Combobox mit Bitmaps

  Alt 30. Nov 2007, 14:15
Zitat von Tyrael Y.:
Wieso sollte es nicht gehen?
Er muss es doch nur verwalten.
Bei OnMouseDown kennt er x und y.
Wenn er in einer ObjectListe feshält, welcher Eintrag welche Daten bekommen hat, kann er anhand davon bestimmen ob er gerade auf einem Bild geklickt hat oder auf den Textbereich.

Ich seh grad nicht wieso das nicht lösbar sein soll.
Darum:
Zitat von Bomberbb:
Das hab ich auch schon probiert. Das funzt leider auch nur bei dem grauen Feld rechts und nicht bei den Items.
Ich habe es extra noch einmal getestet. Es stimmt.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Combobox mit Bitmaps

  Alt 30. Nov 2007, 15:14
Zitat von Deep-Sea:
Ich bezweifel, dass das so einfach geht.
Eine ComboBox ist nun mal nicht dafür gedacht in ihrer DropDown-Liste "Pseudo-Buttons" zu handhaben.
Ich hab mal eine Combo mit Checkboxen zur Bearbeitung von Sets gebaut (siehe Bild), bei der ich vor einem ähnlichen Problem stand. Ich hab mal (hoffentlich alle) relevanten Teile rausgeklaubt:
Delphi-Quellcode:
type
  TRehCheckComboBox = class(TRehCustomComboBox)
  private
    FListInstance: Pointer;
    FDefListProc: Pointer;
    procedure ListWndProc(var Message: TMessage);
    // ...
   end;

constructor TRehCheckComboBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FListInstance := MakeObjectInstance(ListWndProc);
end;

destructor TRehCheckComboBox.Destroy;
begin
  FreeObjectInstance(FListInstance);
  inherited;
end;

procedure TRehCheckComboBox.CreateWnd;
var
  cbi: TComboBoxInfo;
  pListHandle: ^HWND;
begin
  inherited CreateWnd;
  FillChar(cbi, SizeOf(cbi), 0);
  cbi.cbSize := SizeOf(cbi);
  pListHandle := @ListHandle;
  if GetComboBoxInfo(Handle, cbi) then
  begin
    pListHandle^ := cbi.hwndList;
    FDefListProc := Pointer(GetWindowLong(ListHandle, GWL_WNDPROC));
    SetWindowLong(ListHandle, GWL_WNDPROC, Longint(FListInstance));
  end
  else
  begin
    //OutputDebugString(PChar(SysErrorMessage(GetLastError)));
    pListHandle^ := 0;
  end;
end;

procedure TRehCheckComboBox.ListWndProc(var Message: TMessage);
var
  X, Y, Index: Integer;
begin
  case Message.Msg of
    WM_LBUTTONDOWN:
      begin
        X := TWMMouse(Message).XPos;
        Y := TWMMouse(Message).YPos;
        Index := ItemAtPos(Point(X, Y), True);
        if Index <> -1 then
        begin
          if not UseRightToLeftAlignment then
          begin
            if X - ItemRect(Index).Left < GetCheckWidth then
            begin
              ToggleClickCheck(Index);
              Exit;
            end;
          end
          else
          begin
            Dec(X, ItemRect(Index).Right - GetCheckWidth);
            if (X > 0) and (X < GetCheckWidth) then
            begin
              ToggleClickCheck(Index);
              Exit;
            end;
          end;
        end;
      end;
  end;

  Message.Result := CallWindowProc(FDefListProc, ListHandle, Message.Msg,
    Message.WParam, Message.LParam);
end;
HTH,
Uli.
Miniaturansicht angehängter Grafiken
checkcombo_135.png  
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#14

Re: Combobox mit Bitmaps

  Alt 30. Nov 2007, 15:22
Zitat von uligerhardt:
Zitat von Deep-Sea:
Ich bezweifel, dass das so einfach geht.
Eine ComboBox ist nun mal nicht dafür gedacht in ihrer DropDown-Liste "Pseudo-Buttons" zu handhaben.
Ich hab mal eine Combo mit Checkboxen zur Bearbeitung von Sets gebaut [...]
Gibt es einen Grund, warum du dich auf mein Post beziehst? Denn so einfach mit "OnMouseDown published machen" geht es wie gesagt nicht.
Aber nichts desto trotz: Schöner Code
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#15

Re: Combobox mit Bitmaps

  Alt 30. Nov 2007, 15:51
Zitat von Deep-Sea:
Zitat von uligerhardt:
Zitat von Deep-Sea:
Ich bezweifel, dass das so einfach geht.
Eine ComboBox ist nun mal nicht dafür gedacht in ihrer DropDown-Liste "Pseudo-Buttons" zu handhaben.
Ich hab mal eine Combo mit Checkboxen zur Bearbeitung von Sets gebaut [...]
Gibt es einen Grund, warum du dich auf mein Post beziehst?
Ja. Die Checkboxen in meiner Liste funktionieren wie "Pseudo-Buttons", obwohl sie sich in der DropDown-Liste befinden. Davon sprachst du doch?

Zitat von Deep-Sea:
Denn so einfach mit "OnMouseDown published machen" geht es wie gesagt nicht.
In meinem Code kommt auch kein OnMouseDown vor.

Zitat von Deep-Sea:
Aber nichts desto trotz: Schöner Code
Danke. Ich war auch begeistert, als ich ihn grad nach langem mal wieder angesehen habe.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Combobox mit Bitmaps

  Alt 30. Nov 2007, 15:57
Nochmal ein lauffähiges Beispiel:
Delphi-Quellcode:
unit MyCombo;

interface

uses
  Windows,
  Messages,
  Classes,
  StdCtrls;

type
  TRehCheckComboBox = class(TComboBox)
  private
    FListInstance: Pointer;
    FDefListProc: Pointer;
    procedure ListWndProc(var Message: TMessage);
    // List box simulation:
    function ItemAtPos(Pos: TPoint; Existing: Boolean): Integer;
    function ItemRect(Index: Integer): TRect;
  protected
    procedure CreateWnd; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

uses
  SysUtils;

constructor TRehCheckComboBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FListInstance := MakeObjectInstance(ListWndProc);
end;

destructor TRehCheckComboBox.Destroy;
begin
  FreeObjectInstance(FListInstance);
  inherited;
end;

procedure TRehCheckComboBox.CreateWnd;
var
  cbi: TComboBoxInfo;
  pListHandle: ^HWND;
begin
  inherited CreateWnd;
  FillChar(cbi, SizeOf(cbi), 0);
  cbi.cbSize := SizeOf(cbi);
  pListHandle := @ListHandle;
  if GetComboBoxInfo(Handle, cbi) then
  begin
    pListHandle^ := cbi.hwndList;
    FDefListProc := Pointer(GetWindowLong(ListHandle, GWL_WNDPROC));
    SetWindowLong(ListHandle, GWL_WNDPROC, Longint(FListInstance));
  end
  else
  begin
    //OutputDebugString(PChar(SysErrorMessage(GetLastError)));
    pListHandle^ := 0;
  end;
end;

procedure TRehCheckComboBox.ListWndProc(var Message: TMessage);
const
  cCheckWidth = 20;
var
  X, Y, Index: Integer;
begin
  case Message.Msg of
    WM_LBUTTONDOWN:
      begin
        X := TWMMouse(Message).XPos;
        Y := TWMMouse(Message).YPos;
        Index := ItemAtPos(Point(X, Y), True);
        if Index <> -1 then
        begin
          if X - ItemRect(Index).Left < cCheckWidth then
          begin
            Beep; //ToggleClickCheck(Index);
            Exit;
          end;
        end;
      end;
  end;

  Message.Result := CallWindowProc(FDefListProc, ListHandle, Message.Msg,
    Message.WParam, Message.LParam);
end;

function TRehCheckComboBox.ItemAtPos(Pos: TPoint; Existing: Boolean): Integer;
var
  Count: Integer;
  ItemRect, ClientRect: TRect;
begin
  Windows.GetClientRect(ListHandle, ClientRect);
  if PtInRect(ClientRect, Pos) then
  begin
    Result := SendMessage(ListHandle, LB_GETTOPINDEX, 0, 0);
    Count := Items.Count;
    while Result < Count do
    begin
      SendMessage(ListHandle, LB_GETITEMRECT, Result, Longint(@ItemRect));
      if PtInRect(ItemRect, Pos) then Exit;
      Inc(Result);
    end;
    if not Existing then Exit;
  end;
  Result := -1;
end;

function TRehCheckComboBox.ItemRect(Index: Integer): TRect;
var
  Count: Integer;
begin
  Count := Items.Count;
  if (Index = 0) or (Index < Count) then
    SendMessage(ListHandle, LB_GETITEMRECT, Index, Longint(@Result))
  else if Index = Count then
  begin
    SendMessage(ListHandle, LB_GETITEMRECT, Index - 1, Longint(@Result));
    OffsetRect(Result, 0, Result.Bottom - Result.Top);
  end
  else
    FillChar(Result, SizeOf(Result), 0);
end;

end.
Delphi-Quellcode:
unit MainF;

interface

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  MyCombo;

type
  TComboBox = class(TRehCheckComboBox);

  TForm1 = class(TForm)
    ComboBox1: TComboBox;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.
Dabei hat ComboBox1 den Style csDropDownList. Wenn du das Programm laufen lässt, die Combo aufklappst und in die linken 20 Pixel klickst, machst's Piep und die Combo bleibt offen. Das ist doch halbwegs das, was der OP möchte.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#17

Re: Combobox mit Bitmaps

  Alt 30. Nov 2007, 15:57
Zitat von uligerhardt:
Zitat von Deep-Sea:
Denn so einfach mit "OnMouseDown published machen" geht es wie gesagt nicht.
In meinem Code kommt auch kein OnMouseDown vor.
Schau dir Post #6 und #8 an. Darauf bezog ich mich.
Und dein Code ist ja nun mal nicht soo arg leicht verständlich wie OnMouseDown

Nun gut, langsam wird's OT. Ich geh gleich in den Feierabend und euch allen wünsch ich ein schönes Wochenende
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#18

Re: Combobox mit Bitmaps

  Alt 30. Nov 2007, 16:00
Na an die Lösung die Windowsevents abzugreifen hatte ich auch schon gedacht, aber ich hatte noch gehofft, dass es irgendwie einfacher geht. Nun ja, jetzt ist erst mal Wochenende, werde mir die Vorschläge mal nächste Woche ganz in Ruhe zu gemüte führen, aber auf den ersten Blick gefällt mir der 2. besser, mal schauen. So, der Glühwein wartet...

Ein schönes Wochenende und DANKE!!!!!
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#19

Re: Combobox mit Bitmaps

  Alt 30. Nov 2007, 16:30
Zitat von Deep-Sea:
Und dein Code ist ja nun mal nicht soo arg leicht verständlich wie OnMouseDown
Ich weiß. Dafür geht er. Um's mit deinen Worten zu sagen:
Zitat von Deep-Sea:
Ich bezweifel, dass das so einfach geht.
Eine ComboBox ist nun mal nicht dafür gedacht in ihrer DropDown-Liste "Pseudo-Buttons" zu handhaben.
(Hervorhebungen von mir.)

Zitat von Deep-Sea:
Nun gut, langsam wird's OT. Ich geh gleich in den Feierabend und euch allen wünsch ich ein schönes Wochenende
Danke, gleichfalls.

Zitat von Bomberbb:
Na an die Lösung die Windowsevents abzugreifen hatte ich auch schon gedacht, aber ich hatte noch gehofft, dass es irgendwie einfacher geht.
Ich fürchte, leichter geht's nicht.

Zitat von Bomberbb:
So, der Glühwein wartet...
Prost.
Uli Gerhardt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 08:30 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