Delphi-PRAXiS

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 neue ListBox abgeleiten (OOP) (https://www.delphipraxis.net/37376-neue-listbox-abgeleiten-oop.html)

Alex_ITA01 5. Jan 2005 09:32


neue ListBox abgeleiten (OOP)
 
Hallo erstmal,
ich habe folgendes Problem:
Ich will eine neue ListBox ableiten (kein Problem) die mir außerdem noch ein THeaderControl darstellt.
Also ich will "über" der ListBox dann die Komponente HeaderControl darstellen und dann eben darunter die ListBox.Beide Komponenten (HeaderControl und ListBox) will ich zu einer Komponente zusammenfügen.Nur leider wird mir die HeaderControl-Kompo nicht angezeigt...
Könnt ihr mal gucken woran das liegt?

MFG Alex

Delphi-Quellcode:
unit HeaderListe;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, Types, Windows, Graphics, ComCtrls;

type
  THeaderListBox = class(TListBox)
  private
    { Private-Deklarationen }
    FHeaderControl : THeaderControl;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner:TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
  end;
{ ---------------------------------------------------------------------------- }
procedure Register;
{ ---------------------------------------------------------------------------- }
implementation
{ ---------------------------------------------------------------------------- }
procedure Register;
begin
  RegisterComponents('Test', [THeaderListBox]);
end;
{ ---------------------------------------------------------------------------- }
{ THeaderListBox }
{ ---------------------------------------------------------------------------- }
constructor THeaderListBox.Create(AOwner: TComponent);
var
  HS: THeaderSection;
begin
  inherited Create(AOwner);
  FHeaderControl := THeaderControl.Create(AOwner);

  Self.Left   := 248;
  Self.Width  := 249;
  Self.Height := 185;
  Self.Top    := 36;
  Self.Style  := lbOwnerDrawFixed;

  FHeaderControl.Left  := 248;
  FHeaderControl.Width := 249;
  FHeaderControl.Height := 22;
  FHeaderControl.Top   := 15;
  FHeaderControl.Parent := Self;
  FHeaderControl.Align := alCustom;
  FHeaderControl.Style := hsButtons;
  FHeaderControl.Show;
  with FHeaderControl do
  begin
    HS := Sections.Add;
    HS.Text := 'Item1';
    HS.Width := Width div 2;

    HS := Sections.Add;
    HS.Text := 'Item2';
    HS.Width := Width div 2;
  end;
end;
{ ---------------------------------------------------------------------------- }
destructor THeaderListBox.Destroy;
begin
  inherited;
end;
{ ---------------------------------------------------------------------------- }
end.

Christian Seehase 5. Jan 2005 12:45

Re: neue ListBox abgeleiten (OOP)
 
Moin Alex,

ich hab' das jetzt nicht in allen Einzelheiten analysiert, aber da das HeaderControl die ListBox als Parent erhält, muss Du die Positionierung auch entsprechend wählen.

Hierdurch:

Delphi-Quellcode:
Self.Left   := 248;
Self.Top    := 36;

FHeaderControl.Left  := 248;
FHeaderControl.Top   := 15;
FHeaderControl.Parent := Self;
wird die Komponente auf Position (248,36) relativ zum Parent der Komponente angezeigt, und das HeaderControl auf (496,51), relativ zum Parent der Komponente.
Ich vermute mal, dass das ausserhalb des sichbaren Bereiches liegt.
Probier's mal mit

Delphi-Quellcode:
FHeaderControl.Left  := 0;
Ein Control wird immer relativ zum Parent angezeigt.

DP-Maintenance 5. Jan 2005 12:47

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Programmieren allgemein" nach "VCL-Komponenten und Controls" verschoben.
Hat etwas mit Delphi zu tun.

Steve 5. Jan 2005 12:55

Re: neue ListBox abgeleiten (OOP)
 
Hi,

Christian meinte vermutlich "FHeaderControl.Left := 0;" ;)
Dann noch Top:=0 und es ist am oberen Rand - Allerdings innerhalb seines Parents!

Gruß
Stephan :dance:

Christian Seehase 5. Jan 2005 12:59

Re: neue ListBox abgeleiten (OOP)
 
Moin Stephan,

Zitat:

Zitat von Steve
Hi,

Christian meinte vermutlich "FHeaderControl.Left := 0;" ;)

stimmt :wall:

Ist korrgiert.

Alex_ITA01 5. Jan 2005 13:14

Re: neue ListBox abgeleiten (OOP)
 
Ich habe es dann auch mit dem Left := 0 gemerkt :-)
Folgende Lösung habe ich jetzt:

Delphi-Quellcode:
unit HeaderListe;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, Types, Windows, Graphics, ComCtrls;

type
  THeaderListBox = class(TListBox)
  private
    { Private-Deklarationen }
    FHeaderControl : THeaderControl;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner:TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
  end;
{ ---------------------------------------------------------------------------- }
procedure Register;
{ ---------------------------------------------------------------------------- }
implementation
{ ---------------------------------------------------------------------------- }
procedure Register;
begin
  RegisterComponents('Test', [THeaderListBox]);
end;
{ ---------------------------------------------------------------------------- }
{ THeaderListBox }
{ ---------------------------------------------------------------------------- }
constructor THeaderListBox.Create(AOwner: TComponent);
var
  HS: THeaderSection;
begin
  inherited Create(AOwner);
  Self.Left   := 248;
  Self.Width  := 249;
  Self.Height := 185;
  Self.Top    := 100;
  Self.Style  := lbOwnerDrawFixed;

  FHeaderControl := THeaderControl.Create(AOwner);
  FHeaderControl.Parent := TWinControl(AOwner);
  FHeaderControl.Align := alCustom;
  FHeaderControl.Left  := 248;
  FHeaderControl.Width := 249;
  FHeaderControl.Height := 20;
  FHeaderControl.Top   := 81;
  FHeaderControl.Style := hsButtons;
  FHeaderControl.Show;

  with FHeaderControl do
  begin
    HS := Sections.Add;
    HS.Text := 'Item1';
    HS.Width := Width div 2;

    HS := Sections.Add;
    HS.Text := 'Item2';
    HS.Width := Width div 2;
  end;
end;
{ ---------------------------------------------------------------------------- }
destructor THeaderListBox.Destroy;
begin
  FHeaderControl.Free;
  inherited;
end;
{ ---------------------------------------------------------------------------- }
end.
Wenn ich die Kompo zur Laufzeit anzeige funktioniert es.Wenn ich sie aber installiere, dann habe ich auf dem Formular 2Kompo's die ich einzeln anwählen kann und wenn ich F9 drücke kommt ein Fehler:
Exception EClassNotFound in Modul .....
Klasse THeaderControl nicht gefunden.

Wenn ich im Contructor aber folgendes schreibe, dann kommt der Fehler nicht aber ich sehe die HeaderKompo dann zur Designzeit nicht:

Delphi-Quellcode:
  inherited Create(AOwner);
  Self.Left      := 248;
  Self.Width     := 249;
  Self.Height    := 185;
  Self.Top       := 100;
  Self.Style     := lbOwnerDrawFixed;
  Self.OnDrawItem := DrawAllItem;
 
  if ComponentState = [csDesigning] then Exit;
  begin
    FHeaderControl := THeaderControl.Create(AOwner);
    FHeaderControl.SetSubComponent(True);
    FHeaderControl.Parent := TWinControl(AOwner);
    FHeaderControl.Align := alCustom;
    FHeaderControl.Left  := 248;
    FHeaderControl.Width := 249;
    FHeaderControl.Height := 20;
    FHeaderControl.Top   := 81;
    FHeaderControl.Style := hsButtons;
    FHeaderControl.Show;
    FHeaderControl.OnSectionResize := SectionResize;
  end;
Ich hoffe ihr könnt mir helfen...
MFG Alex

Christian Seehase 5. Jan 2005 13:20

Re: neue ListBox abgeleiten (OOP)
 
Moin Alex,

such' hier mal nach Hier im Forum suchenCreateWnd.
Die Konfiguration des Zusätzlichen Controls müsste dort vorgenommen werden.

Alex_ITA01 5. Jan 2005 13:24

Re: neue ListBox abgeleiten (OOP)
 
okay werde mal nachschauen ob ich da was passendes finde.
Danke schonmal
MFG Alex

Alex_ITA01 5. Jan 2005 13:47

Re: neue ListBox abgeleiten (OOP)
 
Damit hats geklappt: CREATEWND...
Danke schön Christian
MFG Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:01 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