AGB  ·  Datenschutz  ·  Impressum  







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

Programmcode geschickter schreiben

Ein Thema von geskill · begonnen am 17. Jun 2009 · letzter Beitrag vom 19. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#1

Programmcode geschickter schreiben

  Alt 17. Jun 2009, 19:49
Hallo,
ich habe eine Prozedur, die mir verschiedene Controls erstellt, die Parameter wie Name, Titel, Position werden für jede neue Komponente gleich übergeben. Also den Block mit (Name := AName; ...) hätte ich dann sehr oft. Die Komponenten basieren aber alle auf einer Basisklasse, welche die meisten oben aufgelisteten Parameter schon enthält.
Code:
TIBasic
|-TIEdit
|-TIComboBox
  |-TIComboBoxList
Nun stellt sich mir die Frage, wie macht man sowas am besten, vorallem muss man beachten das ich die Controls noch in eine Liste (TList) einfügen möchte um sie später wieder freigeben zu können, bzw. um Benutzereingaben zu erhalten. Da müsste man oben dann noch (var NewIEdit:TIEdit ...) einbauen.
Dies ist mein aktueller Ansatz:
Delphi-Quellcode:
TIComponent = (IEdit,IComboBox,IComboBoxList, ...)

procedure TComponentManager.NewControl(AType:TIComponent;
                                       AName,ATitle,AValue,AHint,AList:String;
                                       ALeft,ATop,AWidth,AHeight:Integer);
begin
  case AType of
    IEdit: with TIEdit.Create(FWorkPanel) do
                    begin
                      Name := AName;
                      Title := ATitle;
                      Hint := AHint;
                      Value := AValue;
                      Left := ALeft;
                      Top := ATop;
                      Width := AWidth;
                      Height := AHeight;
                    end;
    IComboBox: with TIComboBox.Create(FWorkPanel) do
                    begin
                      Name := AName;
                      Title := ATitle;
                      Hint := AHint;
                      Value := AValue;
                      Left := ALeft;
                      Top := ATop;
                      Width := AWidth;
                      Height := AHeight;
                    end;
    IComboBoxList: TIComboBoxList.Create(FWorkPanel);
    IPicture: TIPicture.Create(FWorkPanel);
    {noch einige mehr ...}
  end;

  // FControlList.Add()
end;
Sebastian
  Mit Zitat antworten Zitat
squetk

Registriert seit: 29. Aug 2004
Ort: Cottbus
118 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Programmcode geschickter schreiben

  Alt 17. Jun 2009, 20:26
Das lässt sich mit dem Einsatz von Metaklassen lösen.

Ungefähr so:
Delphi-Quellcode:
TIComponent = (IEdit,IComboBox,IComboBoxList, ...)

TIComponentMeta = class of TIComponent;

procedure TComponentManager.NewControl(AType:TIComponentMeta;
                                       AName,ATitle,AValue,AHint,AList:String;
                                       ALeft,ATop,AWidth,AHeight:Integer);
var IComponent : TIComponent;
begin
  IComponent := TIComponentMeta(AType).Create(WorkPanel);
   with IComponent do
                    begin
                      Name := AName;
                      Title := ATitle;
                      Hint := AHint;
                      Value := AValue;
                      Left := ALeft;
                      Top := ATop;
                      Width := AWidth;
                      Height := AHeight;
                    end;
  end;
  // FControlList.Add()
end;
  Mit Zitat antworten Zitat
squetk

Registriert seit: 29. Aug 2004
Ort: Cottbus
118 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Programmcode geschickter schreiben

  Alt 17. Jun 2009, 20:32
Ich sehe grad: TIComponent ist ja keine eigene Klasse.
Haben die Componenten IEdit,IComboBox,IComboBoxList eine gemeinsame Basisklasse?
Ansonsten klappts mit TPersistentClass als Metaklasse.
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Programmcode geschickter schreiben

  Alt 17. Jun 2009, 20:51
Jo, ich habe es schon angepasst, habe extra versucht ein schönes Diagramm zu zeichnen, die Basisklasse ist TIBasic.
Leider bekomme ich beim erstellen eine Fehlermeldung. Ich weiß nicht genau, aber AType ist keine Komponente sondern einfach nur eine Integer Konstante zu einer bestimmten Komponente.

Delphi-Quellcode:
      type
        TIBasicMeta = class of TIBasic;

procedure TComponentManager.NewControl;
var IBasic:TIBasic;
begin
  IBasic := TIBasicMeta(AType).Create(FWorkPanel);
  with IBasic do
  begin
    Name := AName;
    Title := ATitle;
    Hint := AHint;
    //Value := AValue;
    Left := ALeft;
    Top := ATop;
    Width := AWidth;
    Height := AHeight;
  end;

  case AType of
    IEdit: with TIEdit(IBasic) do
                      Value := AValue;

  end;

  FControlList.Add(IBasic);
end;
Sebastian
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Programmcode geschickter schreiben

  Alt 18. Jun 2009, 07:25
Dann vieleicht so ein Ansatz:
Delphi-Quellcode:
function TComponentManager.GetClassType(AType: Integer): TIBasicMeta;
begin
  case AType of
    1: Result := TIEdit;
    {...}
  else
    raise Exception.Create( {...} );
  end;
end;

procedure TComponentManager.NewControl(AType: Integer); overload;
begin
  NewControl(GetClassType(AType));
end;

procedure TComponentManager.NewControl(AClass: TIBasicMeta); overload;
begin
  {...}
end;
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Programmcode geschickter schreiben

  Alt 18. Jun 2009, 21:03
Hmm, es wird nur die Basisklasse erstellt, so war das nicht gewollt :(

Delphi-Quellcode:
procedure TComponentManager.NewControl(AClass: TIBasicMeta; {...});
var IBasic:TIBasic;
begin
  IBasic := AClass.Create(FWorkPanel); // TIBasicMeta(AClass).Create
  with IBasic do
  begin
    Name := AName;
    Title := ATitle;
    Hint := AHint;
    //Value := AValue;
    Left := ALeft;
    Top := ATop;
    Width := AWidth;
    Height := AHeight;
  end;

  if AClass.ClassName = TIEdit.ClassName then
    TIEdit(AClass).Value := AValue; // <-- hier knallt's, da TIBasic erstellt wird und nicht TIEdit

  FControlList.Add(IBasic);
end;
Sebastian
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Programmcode geschickter schreiben

  Alt 19. Jun 2009, 08:18
Ich muss wiedersprechen, es wird eine Instanze von TIEdit erstellt.
Aber die Zeile mit dem cast ist falsch.
Du wandelst eine Klassenvariable in eine Instanzvariable um und weist einem Property (kein class Property) etwas zu?

Das war wohl so gemeint:
Delphi-Quellcode:
if IBasic is TIEdit then
  TIEdit(IBasic).Value := AValue;
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Programmcode geschickter schreiben

  Alt 19. Jun 2009, 13:36
Sorry, mein Fehler, da habe ich gestern Abend was durcheinanderbebracht, natürlich ist der Typecast auf TIBasic bezogen. Aber wenn ich in dieser Zeile:
IBasic := AClass.Create(FWorkPanel); AClass gegen TIEdit ersetzte
IBasic := TIEdit.Create(FWorkPanel); bekomme ich 2 Unterschiedliche Komponenten, da im Create von TIEdit z.b. noch ein TEdit erstellt wird. Oder wenn ich mit dem Debugger Schritt für Schritt durchgehe, bzw. in dem Create von TIEdit einen Haltepunkt setzte merkt man, dass dies bei AClass.Create dies nicht aufgerufen wird.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Programmcode geschickter schreiben

  Alt 19. Jun 2009, 13:40
Sind deine Konstruktoren auch richtig mit virtual/override gekennzeichnet? Welchen Wert hat AClass, wenn Du ihn mit dem Debugger auswertest?

Viele Grüße
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Programmcode geschickter schreiben

  Alt 19. Jun 2009, 13:43
Danke, virtual/override war's :wall:
Sebastian
  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 18:26 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