Autor Beitrag
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Di 09.09.08 22:13 
Hallo,
ich habe eine ListBox. Mit jedem Eintrag ist ein selbstdefiniertes Objekt (TTermin) verknüpft. Wenn ich jetzt die ListBox per SaveToFile speichere und wieder lade, sind die Objekte weg. Wie kann ich die Objekte mitspeichern/laden? :?

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 09.09.08 22:54 
Moin!

user profile iconfreak4fun hat folgendes geschrieben:
ich habe eine ListBox. Mit jedem Eintrag ist ein selbstdefiniertes Objekt (TTermin) verknüpft.
Zeig doch mal die Deklaration der Klasse. ;)

user profile iconfreak4fun hat folgendes geschrieben:
Wenn ich jetzt die ListBox per SaveToFile speichere und wieder lade, sind die Objekte weg.
Das ist klar, .SaveToFile speichert nur die Strings. :nixweiss:

user profile iconfreak4fun hat folgendes geschrieben:
Wie kann ich die Objekte mitspeichern/laden? :?
Die Listbox-Einträge in einer Schleife durchgehen und die einzelnen Objekte speichern/laden. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
freak4fun Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Di 09.09.08 22:57 
Aktuell sieht die Klasse so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
TTermin = class
public
  Text: String;
  Time: TDateTime;
  Fest: Boolean;

  constructor Create(AStunde, AMinute: Integer; AFest: Boolean; AText: String); Overload;
  function getTermin: String;
end;

Sie soll aber jetzt erweitert werden, daher mein Anliegen. :lol:

Ich bin zur Zeit noch am Anfang, also würde auch eine andere Darstellung als die ListBox in Frage kommen. Zum Beispiel StringGrid oder ListView. Da darf dann die Darstellung/Speicherung auch kein problem sein. :?

Ich bin also für Vorschläge offen. ;)

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 09.09.08 23:10 
Moin!

user profile iconfreak4fun hat folgendes geschrieben:
Ich bin zur Zeit noch am Anfang, also würde auch eine andere Darstellung als die ListBox in Frage kommen. Zum Beispiel StringGrid oder ListView. Da darf dann die Darstellung/Speicherung auch kein problem sein. :?
Da ist die erste Problemstelle: nicht die GUI-Controls als "Datenlager" missbrauchen! :? Egal welche Kompo du zum Anzeigen verwendest, das darf keine Auswirkungen auf deine Daten haben. :idea:

user profile iconfreak4fun hat folgendes geschrieben:
Ich bin also für Vorschläge offen. ;)
Alsdann ;)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type
  TTermin = class(TObject)
  private
    FText: String;
    FTime: TDateTime;
    FFest: Boolean;
    function GetAsStr: String// Getter: hier die Daten als eine Zeile liefern
    procedure SetAsStr(const Value: String); // Setter: hier die Daten aus einer Zeile lesen
  public
    constructor Create(AStunde, AMinute: Integer; AFest: Boolean; AText: String);
    function getTermin: String// was tut das?

    property Text: String read FText write FText;
    property Time: TDateTime read FTime write FTime;
    property Fest: Boolean read FFest write FFest;

    property AsStr: String read GetAsStr write SetAsStr;
  end;
Wenn du deine Klasse so umbaust und die Eigenschaft .AsStr entsprechend auslegst, kann eine Instanz dieser Klasse sich selbst als String liefern (.AsStr lesen) oder die Daten aus einem String übernehmen (auf .AsStr schreiben). Dann kannst du z.B. eine TStringList verwenden, um die Zeilen zu sammeln und dann in eine Datei zu schreiben/lesen. Mal so als Ansatz... ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
freak4fun Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Di 09.09.08 23:16 
Das klingt aber nach einem gefrickel. :? Ist das eine übliche Art daten zu speichern? :shock:

Edit: Ich habe hier was gefunden mit Streams, aber da steig ich nicht ganz durch. :?

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 09.09.08 23:32 
Moin!

user profile iconfreak4fun hat folgendes geschrieben:
Das klingt aber nach einem gefrickel. :? Ist das eine übliche Art daten zu speichern? :shock:
Das ist eine Möglichkeit, es gibt sicher noch andere. ;)

user profile iconfreak4fun hat folgendes geschrieben:
Edit: Ich habe hier was gefunden mit Streams, aber da steig ich nicht ganz durch. :?
Das wäre wohl der "übliche Weg", einen StreamWriter/Reader in der Klasse implementieren, aber das könnte noch etwas (zu?) schwer für dich sein. :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
freak4fun Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Di 09.09.08 23:37 
user profile iconNarses hat folgendes geschrieben:
user profile iconfreak4fun hat folgendes geschrieben:
Edit: Ich habe hier was gefunden mit Streams, aber da steig ich nicht ganz durch. :?
Das wäre wohl der "übliche Weg", einen StreamWriter/Reader in der Klasse implementieren, aber das könnte noch etwas (zu?) schwer für dich sein. :?

Aua! Ich steh auf Kriegsfuß mit Streams, das stimmt! :roll: Aber hinkriegen sollte ich das schon nach 3 Jahren Ausbildung in Delphi. :( Sollte mich vielleicht schämen das nicht zu können. :gruebel: Kannst du mir vielleicht trotzdem mal in der Richtung helfen?

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 09.09.08 23:41 
Du kannst kein Objekt direkt speichern. Ein Objekt ist nur ein Zeiger auf ein Speicherbereich an dem die Daten und die Methoden des Objektes im Speicher liegen. Du musst die Daten des Objektes auslesen und in einem sinnvollen Format abspeichern.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 09.09.08 23:48 
Moin!

user profile iconfreak4fun hat folgendes geschrieben:
Kannst du mir vielleicht trotzdem mal in der Richtung helfen?
Du hast doch jetzt schon Infos und sogar schon einen Ansatz bekommen (OK, nicht mit Streams, aber trotzdem). Wie wäre es, wenn du damit mal anfängst du arbeiten? ;) Dann merkst du schon selbst ganz schnell, wo´s lang geht. :idea: Beispielcode gibt´s hier genug, einfach mal die Suche bemühen. :lupe: :les:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
freak4fun Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Mi 10.09.08 00:57 
Danke! Habe es für einen Termin in einem Terminkalender hinbekommen. :D Und nun Objectlisten! :twisted:

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
freak4fun Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Do 11.09.08 15:37 
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:
procedure TForm2.Button1Click(Sender: TObject);
var
  lStream: TFileStream;
  lLen: LongInt;
  lStr: String;
  lInt: Integer;
begin
  lStream := TFileStream.Create('test.dat', fmCreate);
  try
    lStr := 'hallo';
    lInt := Length(lStr);
    lStream.Write(lInt, SizeOf(lInt));
    lStream.Write(PChar(lStr)^, lInt);
  finally
    lStream.Free;
  end;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
  lStream: TFileStream;
  lLen: LongInt;
  lStr: String;
  lInt: Integer;
begin
  lStream := TFileStream.Create('test.dat', fmOpenRead);
  try
    lStream.Read(lInt, SizeOf(lInt));
    Label1.Caption := IntToStr(lInt);
    SetLength(lStr, lInt);
    lStream.Read(PChar(lStr)^, lInt);
    Label2.Caption := IntToStr(Length(lStr)) + ' - ' + lStr;
  finally
    lStream.Free;
  end;
end;


Wenn ich das so ausführe steht in Label2: 5 - halel! Warum? :?

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 11.09.08 16:08 
Moin!

user profile iconfreak4fun hat folgendes geschrieben:
Wenn ich das so ausführe steht in Label2: 5 - halel! Warum? :?
Da du keine absoluten Pfade verwendest: wer sagt, dass es sich beides mal um die gleiche Datei handelt? :?

Ich habe deinen Code gerade getestet: funktioniert einwandfrei. ;) (allerdings mit abs. Pfad)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
freak4fun Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Do 11.09.08 16:21 
Ich sage das, da niemand anderes da eine Datei erstellt! :roll:

Auch mit festem Pfad: ExtractFilePath(ParamStr(0)) + 'test.dat' steht da halel drin ... :(


Edit: Das geht ... sind das WideStrings? :twisted:
ausblenden Delphi-Quelltext
1:
2:
3:
lStream.Write(PChar(lStr)^, lInt * 2);
// ...
lStream.Read(PChar(lStr)^, lInt * 2);

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Sa 13.09.08 16:51 
nee, dass sin nur die standard-C strings.