Autor Beitrag
chrischris
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 17.07.15 20:04 
Guten Tag,
und zwar habe ich anhand der Delphi Hilfe und Informationen und Codebeispielen aus dem Internet mir folgende Klasse geschrieben:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: 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:

ausblenden 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.FormCreate(Sender: TObject);
//eine Variable vom entsprechenden Typ anlegen
var myTest: TTest;
begin
  //ein Objekt erzeugen
  myTest := TTest.Create();  

  //Attribute manipulieren
  myTest.Test1 := 24;
  myTest.Test2 := 'hello world';

  //Attribute lesen
  ShowMessage(myTest.Test2);

  //das Objekt wieder löschen
  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: www.delphi-treff.de/...zugriff-auf-objekte/ ). Der Sinn hierbei ist das verstecken von Details vor dem Nutzer der Klasse.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
chrischris Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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)

ausblenden Delphi-Quelltext
1:
2:
   Test         : TTest;
   ATest        : array of TTest;


ausblenden 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.

ausblenden 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?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 ATest := TObjectList.Create;

 ATest.Add(Test);  // Also auch dann im Buttonevent jeweils, statt Setlenght beim D. Array?
 ATest.Items(Length(ATest)).CardID := 5;

 ATest.Free;
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 18.07.15 16:10 
- Nachträglich durch die Entwickler-Ecke gelöscht -
chrischris Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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?
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 18.07.15 18:41 
- Nachträglich durch die Entwickler-Ecke gelöscht -