Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Klassen aus anderer Unit richtig ansprechen
chrischris - Fr 17.07.15 20:04
Titel: Klassen aus anderer Unit richtig ansprechen
Guten Tag,
und zwar habe ich anhand der Delphi Hilfe und Informationen und Codebeispielen aus dem Internet mir folgende Klasse geschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| TTest = class( TPersistent )
private
FTest1 Integer; FTest2: string; FTest3: string;
procedure AssignToObj( Obj: TTest );
protected procedure AssignTo( Obj: TPersistent ); override;
public constructor Create; destructor Destroy; override;
property Test1: Integer read FTest1 write FTest1; property Test2: string read FTest3 write FTest2; property Test3: string read FTest3 write FTest3; end;
implementation
procedure TTest.AssignTo( Obj: TPersistent ); begin if ( Obj is TTest ) then AssignToObj( Obj as TTest1 ) else inherited; end;
procedure TTest.AssignToObj( Obj: TTest ); begin Dest.FTest1 := Self.FTest1; Dest.FTest2 := Self.FTest2; Dest.FTest3 := Self.FTest3; end;
end. |
Mein Problem ist aber nun, wenn ich diese Klasse einer anderen Unit zuschreibe, weiß ich leider nicht, wie ich diese Prozeduren richtig anspreche. Eventuell könnten Sie mir hier weiterhelfen.
Xion - Fr 17.07.15 21:20
:welcome:
Dem Beispiel fehlt leider noch der Name der Unit. Ich nehme einfach mal an, die Unit mit der Klasse TTest heißt UTest. Die Unit, in welcher diese benutzt werden soll, heiße mal Unit1.
Um nun diese Klasse zu nutzen, muss zunächst in Unit1 im uses-Bereich die Unit UTest eingetragen. Das könnte z.B. so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Gauges, Buttons, UTest; |
Anschließend kann die Klasse in dieser Unit benutzt werden. Um die Prozeduren aufzurufen, muss zunächst ein Objekt davon erzeugt werden. Beispielsweise:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.FormCreate(Sender: TObject); var myTest: TTest; begin myTest := TTest.Create();
myTest.Test1 := 24; myTest.Test2 := 'hello world';
ShowMessage(myTest.Test2);
myTest.Free; end; |
Die Prozeduren können nicht von überall aufgerufen werden. Protected-Methoden können nur von TTest selbst und abgeleiteten Klassen benutzt werden. So wie es momentan aussieht, können sie nicht von Unit1 aus aufgerufen werden. Hierzu müssten sie als public definiert werden (siehe auch:
http://www.delphi-treff.de/object-pascal/zugriff-auf-objekte/ ). Der Sinn hierbei ist das verstecken von Details vor dem Nutzer der Klasse.
chrischris - Sa 18.07.15 15:13
Hallo Xion,
dankeschön für die ausführliche Erklärung!
Also ich kann mittlerweile nun in das Objekt die Property abspeichern.
Ich habe die Klasse in einer anderen Unit über Create erstellt (Im Beenden Modus gebe ich diese wieder Frei über Free). In dieser Unit habe ich dann in public ein Array erstellt welches von der Klasse abstammt ATest: array of TTest
Nun greife ich wiederum aus einer anderen Unit auf dieses Array zu
Public zuweisung in der UnitTestData (Hier wird Test auch erstellt und freigegeben)
Delphi-Quelltext
1: 2:
| Test : TTest; ATest : array of TTest; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| [delphi]
procedure TF_AddTest.btn_AddClick(Sender: TObject); var TestData: TStringlist;
begin
TestData := TStringlist.Create;
TestData.Add(edt_Test1.Text); TestData.Add(edt_Test2.Text);
AddTestData(Length(F_TestData.ATest), TestData); Setlength(F_TestData.ATest,Length(F_TestData.ATest)+1);
end; |
Unit wo AddTestData vorhanden ist.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure AddTestData(Index: Integer; TestData: TStringlist); begin
F_TestData.ATestData[Index].CardID := StrtoInt(TestData[0]);
end; |
Leider funktioniert er nicht, wenn ich aus dem Array die Propertys bearbeiten will.
Was mache ich da falsch?
Oder soll ich die TObjectlist nutzen?
Wenn ja, müsste das dann so aussehen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| ATest := TObjectList.Create;
ATest.Add(Test); ATest.Items(Length(ATest)).CardID := 5;
ATest.Free; |
Delete - Sa 18.07.15 16:10
- Nachträglich durch die Entwickler-Ecke gelöscht -
chrischris - Sa 18.07.15 16:18
Ich dachte bei einem Dynamischen Array muss ich bei der Initialisierung keine Größe festlegen und die Standart Mäßig mit einem Feld belegt ist also 0 beispielsweise (Als erster Index) und man dann zur Laufzeit diese über Setlength erweitern kann?
Oder soll ich dann im Create beispielsweise Setlength(ATest,1) setze?
Delete - Sa 18.07.15 18:41
- Nachträglich durch die Entwickler-Ecke gelöscht -
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!