Results 1 to 8 of 8

Thread: combobox ondrawitem

  1. #1

    combobox ondrawitem

    schiet mij maar lek. Ik heb de volgende code:

    Code:
    unit main;
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLType;
    
    type
    
      { TfrmMain }
    
      TfrmMain = class(TForm)
        ComboBox1: TComboBox;
        procedure FormCreate(Sender: TObject);
      private
        { private declarations }
        procedure MyComboOnDrawItemHandler(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState);
      public
        { public declarations }
      end; 
    
    var
      frmMain: TfrmMain;
    
    implementation
    
    {$R *.lfm}
    
    { TfrmMain }
    
    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
      ComboBox1.OnDrawItem := @MyComboOnDrawItemHandler;
    end;
    
    
    procedure TfrmMain.MyComboOnDrawItemHandler(Control: TWinControl; Index: Integer;
      ARect: TRect; State: TOwnerDrawState);
    var
    Sender: TComboBox;
    begin
      Sender := (Control as TComboBox);
      If odSelected in State then
      begin
        Sender.Canvas.Font.Color := clWhite;
    
        if Index = 0 then
          Sender.Canvas.Brush.Color := clLtGray
        else
        if Index = 1 then
          Sender.Canvas.Brush.Color := clNavy
        else
          Sender.Canvas.Brush.Color := clMaroon;
      end else
      begin
        Sender.Canvas.Brush.Color := clWhite;
    
        if Index = 0 then
          Sender.Canvas.Font.Color := clDkGray
        else
        if Index = 1 then
          Sender.Canvas.Font.Color := clNavy
        else
          Sender.Canvas.Font.Color := clMaroon;
      end;
    
    
      if index = 0 then
      begin
        Sender.Canvas.Font.Bold := true;
        Sender.Canvas.Font.Italic := true;
      end
      else begin
        Sender.Canvas.Font.Bold := false;
        Sender.Canvas.Font.Italic := false;
      end;
    
    
      Sender.Canvas.FillRect(ARect);
      Sender.Canvas.TextOut(ARect.Left,ARect.Top,Sender. Items[Index]);
    end;
    
    
    
    
    
    
    end.
    Dit werkt prima. Nou wil ik in het echte programma gaan bouwen en gaat ie zeuren. Dus wat ik doe:

    Code:
    NewComboBox := TComboBox.Create(Self);
        with NewComboBox do
        begin
          Top    := y_pos;
          Width  := 300;
          Left   := 200;
          Parent := Page;
          OnChange := @MyComboOnChangeHandler;
          OnDrawItem := @MyComboOnDrawItemHandler;
          ReadOnly := True;
          Style := csOwnerDrawFixed;


    Code:
      TfrmMain = class(TForm)
        btnSelectGoldenFile: TButton;
        Button1: TButton;
        Button2: TButton;   
        ..
       procedure MyComboOnDrawItemHandler(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState);

    En ik voeg weer de "TfrmMain.MyComboOnDrawItemHandler" code in. Nou gaat lazarus echter zeuren:


    main.pas(160,20) Error: function header doesn't match any method of this class "TfrmMain.MyComboOnDrawItemHandler(TWinControl,Lon gInt,RECT,TOwnerDrawState);"
    main.pas(95,15) Hint: Found declaration: TfrmMain.MyComboOnDrawItemHandler(TWinControl,Long Int,RECT,TOwnerDrawState);


    Iemand een idee? Zit er al te lang naar te kijken....

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Hoort dit niet eerder thuis in het Lazarus forum?

    Maar even zonder gekheid: wanneer je wazige problemen krijgt als je een With..Do contructie
    gebruikt, dan is de eerste stap die je moet nemen de With..Do verwijderen en alle properties
    even volledig uitschrijven; 9 van de 10 keer is je probleem dan ineens weg
    Delphi Code:
    1. // ...
    2.   NewComboBox := TComboBox.Create(Self);
    3.   NewComboBox.Top    := y_pos;
    4.   NewComboBox.Width  := 300;
    5.   NewComboBox.Left   := 200;
    6.   NewComboBox.Parent := Page;
    7.   NewComboBox.OnChange := @MyComboOnChangeHandler;
    8.   NewComboBox.OnDrawItem := @MyComboOnDrawItemHandler;  
    9.   NewComboBox.ReadOnly := True;
    10.   NewComboBox.Style := csOwnerDrawFixed;
    11. // ...

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  3. #3
    helaas dit hielp niet.
    Ik heb dan alleen de OndrawItem erbuiten gezet.


    delphi Code:
    1. NewComboBox := TComboBox.Create(Self);
    2.     with NewComboBox do
    3.     begin
    4.       Top    := y_pos;
    5.       Width  := 300;
    6.       Left   := 200;
    7.       Parent := Page;
    8.       OnChange := @MyComboOnChangeHandler;
    9.       //OnDrawItem := @MyComboOnDrawItemHandler;
    10.       ReadOnly := True;
    11.       Style := csOwnerDrawFixed;
    12.       Items.AddObject('* DNS *', HostGroup);
    13.  
    14.       ItemIndex := 0;
    15.     end;
    16.     NewComboBox.OnDrawItem := @eMyComboOnDrawItemHandler;

    De naam van de procedure aanpassen helpt ook niet (ik dacht dat ie mss een aantal character van het begin zou gebruiken)
    Hij zet de cursor voor de "eMyComboOnDrawItemHandler" hieronder met de error.

    procedure TfrmMain.eMyComboOnDrawItemHandler(Control: TWinControl;
    Index: Integer; ARect: TRect; State: TOwnerDrawState);
    begin
    Last edited by Marcel; 01-Oct-12 at 09:16.

  4. #4
    naar aanleiding van deze pagina:
    http://www.lazarus.freepascal.org/in...p?topic=7103.0

    Als ik "windows" include, dan werkt ie niet meer.

    Code:
    uses
      //Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLType;
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
      ExtCtrls, ComCtrls, Menus, types, LCLType;
    
    
    type
    
      { TfrmMain }
    
      TfrmMain = class(TForm)
        ComboBox1: TComboBox;
        procedure FormCreate(Sender: TObject);
      private
        { private declarations }
        procedure MyComboOnDrawItemHandler(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState);
      public
        { public declarations }
      end; 
    
    var
      frmMain: TfrmMain;
    
    
    
    
    implementation
    
    //uses
    //  Windows, ShellApi,lclintf, regexpr, LConvEncoding, clipbrd, wininet;
    uses
      windows;

  5. #5
    Marcel

  6. #6
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik kan alleen over Delphi spreken, maar daar moet je een method niet aan een event knopen
    met een apestaartje @ (het is namelijk geen pointer naar een pointer van een method)

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  7. #7
    nou zonder die "windows" include werkt alles prima. Het klopt dat ik de voorbeeldjes die ik over Delphi vond bevatte niet die "@" ervoor.

    Maar, kan ik dit nu beschouwen als bug? lees: bug report inschieten?

  8. #8
    In je implementation verwijst TRect naar Windows.TRect, terwijl het moet verwijzen naar Classes.TRect. Mutatis mutandis voor LCLType.TOwnerDrawState vs Windows.TOwnerDrawState.

    Zo werkt het wel:

    delphi Code:
    1. uses
    2.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Windows, LCLType;
    3.   //LET OP: LCLtype ná Windows

    of gebruik expliciet
    delphi Code:
    1. procedure MyComboOnDrawItemHandler(Control: TWinControl; Index: Integer; ARect: Classes.TRect; State: LCLType.TOwnerDrawState);

    Maar in het laaste geval moet je ook LCLType.odSelected enz. gebruiken.

    Bart

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •