AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi EDIT Inhalte in Datei abspeichern und wieder laden
Thema durchsuchen
Ansicht
Themen-Optionen

EDIT Inhalte in Datei abspeichern und wieder laden

Ein Thema von Andi44 · begonnen am 5. Jan 2008 · letzter Beitrag vom 7. Jan 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: EDIT Inhalte in Datei abspeichern und wieder laden

  Alt 5. Jan 2008, 14:08
Die Idee mit EINEM Ini-File finde ich sehr schön. Ich würde allerdings nicht ein Edit4-Feld nehmen, sondern beim Klicken auf den Speichern- bzw. Laden button einen InputDialog bzw. eine Combobox anzeigen. So ist der Ablauf für den User besser nachvollziehbar. Ausserdem wäre es zu überlegen, die Ini nicht ins Programmverzeichns zu legen.


Ungeachtet dessen, dass ich (soweit ich das Projekt überblicke) wahrscheinlich auch die Ini-Lösung vorziehen würde, möchte ich noch kurz die programmtechnische Umsetzung von Andis eigener Idee zeigen Ich nehme für die Dateiarbeit ein TFilestream. Wenn man die Datei auch händig bearbeiten soll, wäre ein Textfile besser. Aber in dem Fall ist die Ini-Lösung gleich noch 10mal besser.

Delphi-Quellcode:
uses Dialogs;

procedure TForm1.SpeichernButtonClick(Sender: TObject);
var SaveDialog:TSaveDialog;
    Datei:TFileStream;
    i:integer;
    stext:string;
    textlength:integer;
begin
  SaveDialog:=TSavedialog.Create(nil);
  try
    SaveDialog.Filter:='Motoren (*.mot)|*.mot';
    savedialog.DefaultExt:='mot';
    if SaveDialog.Execute then
    begin
      Datei:=TfileStream.Create(SaveDialog.FileName,fmCreate);
      try
        for i:=1 to 3 do
        begin
          stext:=TEdit(findcomponent('Edit'+inttostr(i))).Text;
          textlength:=length(stext);
          Datei.Write(textlength,sizeof(textlength));
          Datei.Write(stext[1],textlength);
        end;
      finally
        Datei.free;
      end;
    end;
  finally
    SaveDialog.Free;
  end;
end;

procedure TForm1.LadenButtonClick(Sender: TObject);
var OpenDialog:TOpenDialog;
    Datei:TFileStream;
    i:integer;
    stext:string;
    textlength:integer;
begin
  OpenDialog:=TOpendialog.Create(nil);
  try
    OpenDialog.Filter:='Motoren (*.mot)|*.mot|Alle Dateien|*.*';
    if OpenDialog.Execute then
    begin
      Datei:=TfileStream.Create(OpenDialog.FileName,fmOpenRead);
      try
        for i:=1 to 3 do
        begin
          Datei.Read(textlength,sizeof(textlength));
          setlength(stext,textlength);
          Datei.Read(stext[1],textlength);
          TEdit(findcomponent('Edit'+inttostr(i))).Text:=stext;
        end;
      finally
        Datei.free;
      end;
    end;
  finally
    OpenDialog.Free;
  end;
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Andi44

Registriert seit: 24. Jan 2005
12 Beiträge
 
#12

Re: EDIT Inhalte in Datei abspeichern und wieder laden

  Alt 5. Jan 2008, 14:13
Das ist eine menge "input"

ich habe zwischenzeitlich google versucht zu befragen, da kam dann so etwas heraus:

Zitat:
procedure TForm1.Button1Click(Sender: TObject);
const Anzahl : integer = 20;
var sl: TStringlist;
i : integer;
begin
if SaveDialog1.Execute then
begin
sl:= TStringlist.Create;
for i:=1 to Anzahl do
begin
sl.Add(TEdit(FindComponent('Edit'+IntToStr(i))).Te xt);
end;
sl.SaveToFile(SaveDialog1.Filename);
sl.free;
end;
end;
Da scheint auch der dialog an sich vorhanden zu sein.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: EDIT Inhalte in Datei abspeichern und wieder laden

  Alt 5. Jan 2008, 14:15
Jep, den Dialog findest du irgendwo in deiner Palette und kannst auf das Form ziehen.
Die Stringlist ist (sofern du immer Text hast) ein bisschen schöner.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#14

Re: EDIT Inhalte in Datei abspeichern und wieder laden

  Alt 5. Jan 2008, 14:40
hier 'n serializierungsbeispiel

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    bClear: TButton;
    bSave: TButton;
    bLoad: TButton;
    procedure bClearClick(Sender: TObject);
    procedure bSaveClick(Sender: TObject);
    procedure bLoadClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.bClearClick(Sender: TObject);
begin
 Edit1.Text := '';
 Edit2.Text := '';
 edit3.text := '';
end;

procedure TForm1.bLoadClick(Sender: TObject);
var
 fs: tFileStream;
begin
  fs := tFileStream.Create(paramstr(0)+'.save', fmOpenReadWrite);
  fs.ReadComponent(edit1);
  fs.ReadComponent(edit2);
  fs.ReadComponent(edit3);
  fs.free;
end;

procedure TForm1.bSaveClick(Sender: TObject);
var
 fs: tFileStream;
begin
 fs := tFileStream.Create(paramstr(0)+'.save', fmCreate or fmOpenReadWrite);
 fs.WriteComponent(edit1);
 fs.WriteComponent(edit2);
 fs.WriteComponent(edit3);
 fs.free;
end;

end.
  Mit Zitat antworten Zitat
Twinsetter

Registriert seit: 30. Dez 2007
9 Beiträge
 
#15

Re: EDIT Inhalte in Datei abspeichern und wieder laden

  Alt 5. Jan 2008, 19:38
@ grenzgaenger
Deine Lösung ist quelltextmäßig sehr kurz und auch elegant, bei der Angabe des Dateinamens ist DIr aber ein Fehler unterlaufen. Bei Deinem Code würde zum ersten jedesmal die Datendatei überschrieben, da Du den Dateinamen nicht änderst. Du verwendest mit Paramstr(0) den Namen Deines Programmes dem Du einfach nur die Extention .save dranhängst. Der Filename würde dann beispielsweise MeinProgramm.exe.save lauten.

Zum andern speicherst Du mit dieser Methode die kompletten TEdit-Objekte mit allen Properties ab. Abgesehen davon das dies unnötig Speicherplatz kostet - was heutzutage siche keine Rolle spielt - dürfte es aber auch Probleme beim Einlesen geben wenn später einmal das GUI geändert wird und alte gespeicherte Daten wieder eingelesen werden.

Für dieses Problem gibt es eigentlich nur zwei vernünftige Lösungen
1. mit Inidatei - man kann sie ja jedesmal mit einem andern Namen abspeichern
2. die klassische Methode mit einem Record und einen File vom Typ Recocord

Ich persönlich würde hier aber die Inimethode vorziehen.
Ach so - es auch gibt noch eine dritte Variante, die ich persönlich ganz gut finde - indizierte Stringliste.
z.B:
Delphi-Quellcode:
procedure SaveToFile(Datei:string)
var
  Liste : TStringlist
begin
  Liste:=TStringList.Create;
  Liste.Add('Name='+ed_0.text);
  Liste.Add('drehzahl='+ed_1.text);
  Liste.Add('untersetzung='+ed_2.text);
  Liste.Add('steigung='+ed_3.text);
  Liste.SaveToFile(Datei);
  Liste.Free;
end;


procedure LoadFromFile(Datei:string)
var
  Liste : TStringlist
begin
  Liste:=TStringList.Create;
  Liste.LoadFromFile(Datei)
  ed_0.text:=Liste.IndexOf('Name');
  ed_1.text:=Liste.IndexOf('drehzahl');
  ed_2.text:=Liste.IndexOf('untersetzung');
  ed_3.text:=Liste.IndexOf('steigung');
  Liste.Free;
end;
Diesen Proceduren wird beim Aufruf nur ein Dateiname übergeben der zum Beispiel über einen Speichern- bzw. Öffnendialog erzeugt wird. Dateiname und Extention sind vollig frei wählbar. Vorteil dieser Sache ist, daß die Dateien reine Textdateien sind und somit mit jedem Editor gelesen werden können wenn das Programm mal nicht verfügbar ist. Auch Einlesen mit Excel wäre möglich und sogar gut lesbar.
  Mit Zitat antworten Zitat
Andi44

Registriert seit: 24. Jan 2005
12 Beiträge
 
#16

Re: EDIT Inhalte in Datei abspeichern und wieder laden

  Alt 7. Jan 2008, 00:04
Hallo!

Ich habe es nun mit der Methode von Sirius gelöst.

Zitat:
uses Dialogs;

procedure TForm1.SpeichernButtonClick(Sender: TObject);
var SaveDialog:TSaveDialog;
Datei:TFileStream;
i:integer;
stext:string;
textlength:integer;
begin
SaveDialog:=TSavedialog.Create(nil);
try
SaveDialog.Filter:='Motoren (*.mot)|*.mot';
savedialog.DefaultExt:='mot';
if SaveDialog.Execute then
begin
Datei:=TfileStream.Create(SaveDialog.FileName,fmCr eate);
try
for i:=1 to 3 do
begin
stext:=TEdit(findcomponent('Edit'+inttostr(i))).Te xt;
textlength:=length(stext);
Datei.Write(textlength,sizeof(textlength));
Datei.Write(stext[1],textlength);
end;
finally
Datei.free;
end;
end;
finally
SaveDialog.Free;
end;
end;

procedure TForm1.LadenButtonClick(Sender: TObject);
var OpenDialog:TOpenDialog;
Datei:TFileStream;
i:integer;
stext:string;
textlength:integer;
begin
OpenDialog:=TOpendialog.Create(nil);
try
OpenDialog.Filter:='Motoren (*.mot)|*.mot|Alle Dateien|*.*';
if OpenDialog.Execute then
begin
Datei:=TfileStream.Create(OpenDialog.FileName,fmOp enRead);
try
for i:=1 to 3 do
begin
Datei.Read(textlength,sizeof(textlength));
setlength(stext,textlength);
Datei.Read(stext[1],textlength);
TEdit(findcomponent('Edit'+inttostr(i))).Text:=ste xt;
end;
finally
Datei.free;
end;
end;
finally
OpenDialog.Free;
end;
end;
Was soll ich sagen?

Es ist exakt so, wie ich mir das vorgestellt hatte - Allerbesten Dank dafür!!!!!

Klasse, dass einem so schnell hier geholfen wird!


gruss
Andi
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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