Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ausgabe eines geladenen Records in Memofeldern (https://www.delphipraxis.net/129405-ausgabe-eines-geladenen-records-memofeldern.html)

Giertier 18. Feb 2009 15:36


Ausgabe eines geladenen Records in Memofeldern
 
Ich schon wieder ;),

Und zwar habe ich folgendes Problem. Ich möchte Daten aus Editfeldern in ein Record speichern:

Record:
Delphi-Quellcode:
 Bilddaten = record
 RTitel, RAutor, RThema, RAufnahmekontext, RBlende, RBZ1, RBZ2, RBG1, RBG2,
 RAuflösung, RSchlagworte, RBeschreibung, RDat1, RDat2, RDat3, RAFormat: string[100];
 end;
Einlesen in den Record:
Delphi-Quellcode:
procedure Einlesen;
var
 Titel, Autor, Thema, Aufnahmekontext, Blende, BZ1, BZ2, BG1, BG2,
 Auflösung, Schlagworte, Beschreibung, Dat1, Dat2, Dat3, AFormat: Bilddaten;
begin

Titel.RTitel:= Form3.Edit13.Text;
Autor.RAutor:= Form3.Edit2.Text;
Thema.RThema:= Form3.Edit3.Text;
Aufnahmekontext.RAufnahmekontext:= Form3.Edit4.Text;
Blende.RBlende:= Form3.Edit1.Text;
BZ1.RBZ1:= Form3.Edit8.Text;
BZ2.RBZ2:= Form3.Edit9.Text;
BG1.RBG1:= Form3.Edit5.Text;
BG2.RBG2:= Form3.Edit6.Text;
Auflösung.RAuflösung:= Form3.Edit10.Text;
Schlagworte.RSchlagworte:= Form3.Edit7.Text;
Beschreibung.RBeschreibung:= Form3.Memo1.Text;
Dat1.RDat1:= Form3.ComboBox1.Text;
Dat2.RDat2:= Form3.ComboBox2.Text;
Dat3.RDat3:= Form3.ComboBox3.Text;
AFormat.RAFormat:= Form3.ComboBox6.Text;
end;
Nun habe ich keine Ahnung wie man den Record speichert, hab das mal so probiert:

Delphi-Quellcode:
procedure Speichern;
var datei: file of Bilddaten;
begin
 if Form1.Savedialog1.Execute then
  begin
  try
  assignfile(Datei,Form1.Savedialog1.FileName);
  rewrite(datei);
  write(datei, Datensatz);
  finally
  close(datei);
  end;
  end;
end;
Datensatz habe ich vorher global als Datensatz: Bilddaten deklariert.

Wie kann ich das Ganze(, wenn es überhaupt richtig gespeichert wurde) jetzt wieder durch Laden der Datei, in dem der record eigentlich gespeichert werden sollte, in den Editfeldern oder auch einem Memofeld ausgeben?

Später will ich allerdings nicht nur ein Record speichern, sondern mehrere, bräuchte da also einen Array...
Es handelt sich um ein Bilddatenverwaltungsprogramm, bei dem jeder User also "seine" Datei mit den gespeicherten Bilddaten wieder aufrufen, also mehrere Bilddaten verwalten können soll.

Ich hoffe ihr könnt mir helfen :)

Liebe Grüße

Giertier

sirius 18. Feb 2009 16:08

Re: Ausgabe eines geladenen Records in Memofeldern
 
erstmal:
Delphi-Quellcode:
procedure Einlesen;
var Datensatz:Bilddaten; //wahrscheinlich aber nicht lokal hier definieren, damit du nachher speichern kannst.
begin
  Datensatz.RTitel:= Form3.Edit13.Text;
  Datensatz.RAutor:=...;
  ...
end;
Das schreiben ist soweit ok. Lesen kannst du mit Reset(file) und Read.

Giertier 18. Feb 2009 16:21

Re: Ausgabe eines geladenen Records in Memofeldern
 
Danke für deine schnelle Antwort :-D

Hab ich gemacht :)

Und wie bekomm ich die gelesenen Daten jetzt in mein Memofeld zurück :gruebel: (Ich bin gerade einfach zu blöd sorry :wall:)

EDIT: Müsste in der Datei dann nicht irgendwas drin stehen, wenn ich die mit dem Editor z.b. öffne? Weil die ganz leer ist, nicht mal irgendwelche komischen Zeichen...)

taaktaak 18. Feb 2009 16:23

Re: Ausgabe eines geladenen Records in Memofeldern
 
... aber besser das close() gar nicht erst angewöhnen,
besser ist closefile() zu verwenden

sirius 18. Feb 2009 16:40

Re: Ausgabe eines geladenen Records in Memofeldern
 
Zitat:

Zitat von Giertier
EDIT: Müsste in der Datei dann nicht irgendwas drin stehen, wenn ich die mit dem Editor z.b. öffne? Weil die ganz leer ist, nicht mal irgendwelche komischen Zeichen...)

Sollte.

Neben dem richtigen Close(File), hast du auch die gleiche Variable "Datensatz" verwendet?

Giertier 18. Feb 2009 16:47

Re: Ausgabe eines geladenen Records in Memofeldern
 
Also ich hab jetzt hier noch mal die ganze Unit mit den Prozeduren, die ich fürs Hauptprogramm nutze aufgelistet

Delphi-Quellcode:
unit Pfadkopie;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, jpeg, ExtDlgs;

type
 Bilddaten = record
 RTitel, RAutor, RThema, RAufnahmekontext, RBlende, RBZ1, RBZ2, RBG1, RBG2,
 RAuflösung, RSchlagworte, RBeschreibung, RDat1, RDat2, RDat3, RAFormat: string[100];
 end;

procedure Pfad;
procedure Einlesen;
procedure Speichern;
procedure Laden;
procedure Schreiben;

var
 Datensatz: Bilddaten;



implementation

uses unit1, unit3;

procedure Pfad;
var Zieldatei: string;
begin
 if Form1.OpenPictureDialog1.Execute then
 begin
  Form3.close;
  ZielDatei:= Form1.OpenPictureDialog1.FileName;
  Form1.Image2.Picture.LoadFromFile(Zieldatei);
  Form1.image2.Stretch:= true;
  Form1.image2.proportional:=true;
  Form1.image2.show;
  Form1.Enabled := false;
  Form3:= TForm3.Create(Application);
  Form3.Show;
  Form3.Label20.Caption:= ExtractFileExt(Zieldatei);
  Form3.Label17.Caption:= Zieldatei;
 end;
end;

procedure Einlesen;

begin

Datensatz.RTitel:= Form3.Edit13.Text;
Datensatz.RAutor:= Form3.Edit2.Text;
Datensatz.RThema:= Form3.Edit3.Text;
Datensatz.RAufnahmekontext:= Form3.Edit4.Text;
Datensatz.RBlende:= Form3.Edit1.Text;
Datensatz.RBZ1:= Form3.Edit8.Text;
Datensatz.RBZ2:= Form3.Edit9.Text;
Datensatz.RBG1:= Form3.Edit5.Text;
Datensatz.RBG2:= Form3.Edit6.Text;
Datensatz.RAuflösung:= Form3.Edit10.Text;
Datensatz.RSchlagworte:= Form3.Edit7.Text;
Datensatz.RBeschreibung:= Form3.Memo1.Text;
Datensatz.RDat1:= Form3.ComboBox1.Text;
Datensatz.RDat2:= Form3.ComboBox2.Text;
Datensatz.RDat3:= Form3.ComboBox3.Text;
Datensatz.RAFormat:= Form3.ComboBox6.Text;
end;

procedure Speichern;
var datei: file of Bilddaten;
begin
 if Form1.Savedialog1.Execute then
  begin
  try
  assignfile(Datei,Form1.Savedialog1.FileName);
  rewrite(datei);
  write(datei, Datensatz);
  finally
  closefile(datei);
  end;
  end;
end;

procedure Laden;
var Datei: file of Bilddaten;
begin
 if Form1.OpenDialog1.Execute then
  begin
  assignfile(datei, Form1.OpenDialog1.FileName);
  reset(datei);
  read(Datei, Datensatz);
  closefile(datei);
  end;
end;
Und wenn ich die Datein geladen hab, hätte ich das gerne in etwa so hier:

Delphi-Quellcode:
Form1.Memo1.Text:=
'Titel: '+Datensatz.RTitel+#13#10+#13#10+
'Aufnahmedatum: '+Datensatz.RDat1+Datensatz.RDat2+Datensatz.RDat3+#13#10+#13#10+
'Autor: '+Datensatz.RAutor+ #13#10+#13#10+'Thema: '+Datensatz.RThema+#13#10+#13#10+
'Aufnahmekontext: '+Datensatz.RAufnahmekontext+#13#10+#13#10+
'Blende: '+Datensatz.RBlende+' mm'+#13#10+#13#10;
...
Also würde im Memofeld gerne den Datensatz ausgeben, den ich geladen habe.

sirius 18. Feb 2009 16:58

Re: Ausgabe eines geladenen Records in Memofeldern
 
Sieht doch gut aus. Wenn du jetzt die Reihenfolge der Prozeduraufrufe richtig machst, sollte es klappen.

Giertier 18. Feb 2009 17:10

Re: Ausgabe eines geladenen Records in Memofeldern
 
Vielen, vielen Dank!

Genau daran lags, ich hab Einlesen nach Speichern geschrieben :wall:

Danke, nochmal an alle, die mir hier geholfen haben :)

taaktaak 18. Feb 2009 17:54

Re: Ausgabe eines geladenen Records in Memofeldern
 
Aber auch wenn es jetzt funktioniert, vielleicht noch zwei Hinweise:

Die Bezüge innerhalb der Unit auf verschiedene Formulare und deren Controls in anderen Units sind "unschön" und fehleranfällig. In einer Mini-Anwendung mag das funktionieren. Versuche doch einmal das anders zu lösen. Globale Variablen sollte man ebenfalls möglichst vermeiden. Mach' dir auch darüber Gedanken, wie dies in deinem Fall anders zu realisieren wäre.

Giertier 19. Feb 2009 07:41

Re: Ausgabe eines geladenen Records in Memofeldern
 
Zitat:

Zitat von taaktaak
Aber auch wenn es jetzt funktioniert, vielleicht noch zwei Hinweise:

Die Bezüge innerhalb der Unit auf verschiedene Formulare und deren Controls in anderen Units sind "unschön" und fehleranfällig. In einer Mini-Anwendung mag das funktionieren. Versuche doch einmal das anders zu lösen. Globale Variablen sollte man ebenfalls möglichst vermeiden. Mach' dir auch darüber Gedanken, wie dies in deinem Fall anders zu realisieren wäre.

Daran habe ich auch schon gedacht, weil uns sowas auch immer erzählt wird. Allerdings bin ich noch ziemlich grün hinter den Ohren, was Delphi algemein angeht. Gibt es denn auch eine Möglichkeit alle Formulare in eine Unit zu packen? Wenn ich dann z.B. mit Visible arbeite oder so?

Dann habe ich jetzt noch das Problem, dass ich nun nicht nur einen einzigen Record in der Datei speichern möchte, sondern eben mehrere Datensätze. Sowas löst man ja sicher mit einem Array of Record, oder? Wie stelle ich es aber an, dass nicht jedes mal, wenn ich in einem Formular (bei mir eben Form3) auf Speichern klicke, nicht die ganze Datei neu geschrieben wird und dann wieder nur ein Datensatz drin steht, sondern eben nur der neue hinzugefügt wird? Lasse ich dann einfach das rewrite weg? Wenn ich jetzt sowas mache wie

Delphi-Quellcode:
Datensatz: Array of Bilddaten
Dann haben meckern ja die im Record deklarierten Strings wie RTitel usw. wieder rum, dass sie keine Klasse oder eben keinen Record haben, weil Datensatz ja jetzt als Array und nicht mehr direkt als Bilddaten deklariert ist.

Liebe Grüße

Giertier


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr.
Seite 1 von 2  1 2      

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