Simples Anfängerproblem (onclick +1 machen)

Ich zahl dir mal n Bier für die Hilfe.:-)

Aber ich lass noch net locker:
Wie kann ich jetzt den untersten wert "noch zu zahlen" speichern?
 
Ich persönlich bin ja ein Freund der Registry :-)

Das ganze wird jetzt aber etwas komplizierter:

Zuerst muss in der globalen uses (Ganz oben im Quelltext) Anweisung die Unit Registry hinzugefügt werden, damit die Funktionen zum Speichern und Lesen in der Registry verfügbar sind.

Danach baust du dir am besten zwei Prozeduren, eine zum Speichern des Wertes, die du beim Beenden des Programms aufrufst und eine zum Lesen, die du beim Starten des Programms aufrufst.

In den Prozeduren muss dann jeweils ein Objekt der Klasse TRegistry erstellt werden. Diesem Objekt muss dann mitgeteilt werden, wo die Werte innerhalb der Registry stehen sollen und mit den entsprechenden Schreib- und Lesebefehlen kann dann der Wert gespeichert und gelesen werden:

Code:
uses {Hier stehen noch andere Units}, Registry;

// Innerhalb deines Formulars die zwei neuen Prozeduren deklarieren
type
  TForm1 = class(TForm)
    // Komponenten auf dem Formular
  private
    { Private declarations }
    procedure SaveValues;
    procedure ReadValues;
  public
    { Public declarations }
  end;

// Im Implementation Abschnitt:
procedure TForm1.ReadValues;
var reg: TRegistry;
begin
  reg:=TRegistry.Create;                // Registry Objekt erstellen
  reg.RootKey:=HKEY_LOCAL_MACHINE;      // Rootkey festlegen
  { Jetzt wird die eigentliche Position in der Registry
    festgelegt, falls der Key noch nicht existiert, wird
    das Editfeld einfach auf 0 gesetzt, ansonsten der gespeicherte
    Wert aus der Regitry ausgelesen }
  if reg.OpenKey('Software\DeinWunschname', false) then
    Edit6.Text:=reg.ReadString('NochZuZahlen')
  else
    Edit6.Text:='0';
  // Am Ende aufräumen und den Speicher wieder freigeben
  reg.CloseKey;
  reg.Free;
end;

procedure TForm1.SaveValues;
var reg: TRegistry;
begin
  reg:=TRegistry.Create;                // Registry Objekt erstellen
  reg.RootKey:=HKEY_LOCAL_MACHINE;      // Rootkey festlegen
  { Jetzt wird die eigentliche Position in der Registry
    festgelegt, falls der Key noch nicht existiert, wird
    er angelegt (true am Ende von OpenKey). Mit WriteString
    wird dann der Wert abgespeichert }
  reg.OpenKey('Software\DeinWunschname', true);
  reg.WriteString('NochZuZahlen', Edit6.Text);
  // Am Ende aufräumen und den Speicher wieder freigeben
  reg.CloseKey;
  reg.Free;
end;

So das war jetzt mal die Schnellversion, wenn ich Zeit und Lust hab schreib ich dazu vielleicht mal ein Tutorial. Die Funktionsweise im Detail zu erklären würde hier den Rahmen sprengen, aber das Thema Registry ist in der Delphi Hilfe auch mit Beispielen sehr gut beschrieben.

Grüße Thomas
 
-

Hallo,
Damit dies auch bei den restlichen Editfeldern funktioniert, muss die eben geschriebene Behandlungsroutine noch den restlichen Editfeldern zugewiesen werden.
Schon mal was Funktionen/Prozeduren gehört?

Den gleichen Ausdrück fünfmal in eine Ereignis-Routine zu schreiben, finde ich persönlich ziemlich unschön. Also um das ganze wartbar zu halten, sollte man den Ausdruck schon in eine Methode auslagern.

Wenn du deine Daten nicht gerade in der total übersichtlichen Windows-Registry speichern möchtest - was ich persönlich gut verstehen könnte :) - dann nutze doch die Funktionen AssignFile, Reset, Rewrite, Write, Read oder die objektorientierte Version TStream.

Gruß Patrick
 
Hab alles gemacht, so wie du´s geschrieben hast.
Seh ich das richtig, dass es automatisch die read/save prozedur beim starten/beenden des Programms ausführt?

Denn der registry eintrag wird gar nicht erstellt.

@Patrick vlt hast du übersehen, dass ich erst seit 2 Tagen Delphi lerne. Mit deinem Post kann ich nicht viel anfangen. :-)

ich poste jetzt erstmal meinen Quelltext. Vielleicht seh ich den Fehler einfach nicht!
Aber nicht lachen, weil ich alles "etwas" umständlich gelöst hab!

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, TabNotBk, Menus, Buttons, ExtCtrls, Registry;


type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    TabbedNotebook1: TTabbedNotebook;
    Button2: TButton;
    Edit2: TEdit;
    Button3: TButton;
    Edit3: TEdit;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Edit4: TEdit;
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    Open1: TMenuItem;
    Save1: TMenuItem;
    Quit1: TMenuItem;
    Help1: TMenuItem;
    Info1: TMenuItem;
    BitBtn1: TBitBtn;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Edit5: TEdit;
    Edit6: TEdit;
    Button9: TButton;
    Button10: TButton;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Edit7: TEdit;
    Edit8: TEdit;
    Label10: TLabel;
    Label11: TLabel;
    Panel1: TPanel;
    Label12: TLabel;
    Edit9: TEdit;
    GroupBox2: TGroupBox;
    Edit10: TEdit;
    Label13: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Edit6Change(Sender: TObject);
    procedure Edit5Change(Sender: TObject);
    procedure Edit4Change(Sender: TObject);
    procedure Edit7Change(Sender: TObject);
    procedure Edit8Change(Sender: TObject);
    procedure Edit9Change(Sender: TObject);

  private
    { Private-Deklarationen }
    procedure SaveValues;
    procedure ReadValues;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.SaveValues;
var reg: TRegistry;
begin
  reg:=TRegistry.Create;                // Registry Objekt erstellen
  reg.RootKey:=HKEY_LOCAL_MACHINE;      // Rootkey festlegen
  { Jetzt wird die eigentliche Position in der Registry
    festgelegt, falls der Key noch nicht existiert, wird
    er angelegt (true am Ende von OpenKey). Mit WriteString
    wird dann der Wert abgespeichert }
  reg.OpenKey('Software\Barc', true);
  reg.WriteString('NochZuZahlen', Edit10.Text);
  // Am Ende aufräumen und den Speicher wieder freigeben
  reg.CloseKey;
  reg.Free;
end;


procedure TForm1.ReadValues;
var reg: TRegistry;
begin
  reg:=TRegistry.Create;                // Registry Objekt erstellen
  reg.RootKey:=HKEY_LOCAL_MACHINE;      // Rootkey festlegen
  { Jetzt wird die eigentliche Position in der Registry
    festgelegt, falls der Key noch nicht existiert, wird
    das Editfeld einfach auf 0 gesetzt, ansonsten der gespeicherte
    Wert aus der Regitry ausgelesen }
  if reg.OpenKey('Software\Barc', false) then
    Edit10.Text:=reg.ReadString('NochZuZahlen')
  else
    Edit10.Text:='0';
  // Am Ende aufräumen und den Speicher wieder freigeben
  reg.CloseKey;
  reg.Free;
end;



procedure TForm1.Button1Click(Sender: TObject);
var a,b,c: currency;

begin
a := strtofloat( edit1.Text );
b := 1.5;
c := a+b;


Edit1.Text := Floattostr( c );
end;

procedure TForm1.Button2Click(Sender: TObject);
var a,b,c: extended;

begin
a := strtofloat( edit2.Text );
b := 1;
c := a+b;


Edit2.Text := Floattostr( c );
end;

procedure TForm1.Button3Click(Sender: TObject);
var a,b,c: extended;

begin
a := strtofloat( edit3.Text );
b := 0.5;
c := a+b;


Edit3.Text := Floattostr( c );

end;

procedure TForm1.Button4Click(Sender: TObject);
var a,b,c,d,e,f: extended;

begin
a := strtofloat( edit1.Text );
b := strtofloat( edit2.Text );
c := strtofloat( edit3.Text );
d := strtofloat( edit5.Text );
e := strtofloat( edit6.Text );
f := a+b+c+d+e;

Edit4.Text := Floattostr( f );
end;

procedure TForm1.Button5Click(Sender: TObject);
var a,b,c,e,f,g,x: extended;
begin
a := strtofloat( edit1.Text );
b := strtofloat( edit2.Text );
c := strtofloat( edit3.Text );
e := strtofloat( edit5.Text );
f := strtofloat( edit6.Text );
g := strtofloat( edit9.Text );
x := 0;
Edit1.Text := Floattostr( x );
Edit2.Text := Floattostr( x );
Edit3.Text := Floattostr( x );
Edit5.Text := Floattostr( x );
Edit6.Text := Floattostr( x );
Edit9.Text := Floattostr( x );
end;

procedure TForm1.Button6Click(Sender: TObject);
var a,b,c: extended;

begin
a := strtofloat( edit1.Text );
b := 1.5;
c := a-b;


Edit1.Text := Floattostr( c );

end;

procedure TForm1.Button7Click(Sender: TObject);
var a,b,c: extended;

begin
a := strtofloat( edit2.Text );
b := 1;
c := a-b;


Edit2.Text := Floattostr( c );

end;

procedure TForm1.Button8Click(Sender: TObject);
var a,b,c: extended;

begin
a := strtofloat( edit3.Text );
b := 0.5;
c := a-b;


Edit3.Text := Floattostr( c );

end;

procedure TForm1.Button9Click(Sender: TObject);
var a,b,c: extended;

begin
a := strtofloat( edit6.Text );
b := 0.5;
c := a+b;


Edit6.Text := Floattostr( c );

end;

procedure TForm1.Button10Click(Sender: TObject);
var a,b,c: extended;

begin
a := strtofloat( edit6.Text );
b := 0.5;
c := a-b;


Edit6.Text := Floattostr( c );
end;

procedure TForm1.Edit1Change(Sender: TObject);

begin
Edit4.Text := FloatToStr(StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text) + StrToFloat(Edit3.Text) + StrToFloat(Edit5.Text) + StrToFloat(Edit6.Text));
end;


procedure TForm1.Edit2Change(Sender: TObject);

begin
Edit4.Text := FloatToStr(StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text) + StrToFloat(Edit3.Text) + StrToFloat(Edit5.Text) + StrToFloat(Edit6.Text));
end;

procedure TForm1.Edit3Change(Sender: TObject);

begin
Edit4.Text := FloatToStr(StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text) + StrToFloat(Edit3.Text) + StrToFloat(Edit5.Text) + StrToFloat(Edit6.Text));
end;

procedure TForm1.Edit6Change(Sender: TObject);

begin
Edit4.Text := FloatToStr(StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text) + StrToFloat(Edit3.Text) + StrToFloat(Edit5.Text) + StrToFloat(Edit6.Text));
end;

procedure TForm1.Edit5Change(Sender: TObject);

begin
Edit4.Text := FloatToStr(StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text) + StrToFloat(Edit3.Text) + StrToFloat(Edit5.Text) + StrToFloat(Edit6.Text));
end;

procedure TForm1.Edit4Change(Sender: TObject);
begin
Edit8.Text := FloatToStr(StrToFloat(Edit4.Text) + StrToFloat(Edit7.Text));
end;

procedure TForm1.Edit7Change(Sender: TObject);
begin
Edit8.Text := FloatToStr(StrToFloat(Edit4.Text) + StrToFloat(Edit7.Text));
end;

procedure TForm1.Edit8Change(Sender: TObject);
begin
Edit10.Text := FloatToStr(StrToFloat(Edit8.Text) - StrToFloat(Edit9.Text));
end;

procedure TForm1.Edit9Change(Sender: TObject);
begin
Edit10.Text := FloatToStr(StrToFloat(Edit8.Text) - StrToFloat(Edit9.Text));

end;

end.
 
Zuletzt bearbeitet:
Hallo,

@Patrick:
Schon mal was Funktionen/Prozeduren gehört?
Schon mal was davon gehört, das man eine Routine auch anderen Ereignissen zuweisen kann? Dabei wird keine neue Routine geschrieben, sonderen der Komponente nur mitgeteilt, dass sie die bereits vorhandene Routine benutzen soll. Ich habe nichts davon geschrieben, dass man jeweils eine eigene Routine anlegen und Quellcode kopieren soll.

Leg doch einfach mal zwei Editfelder auf ein Formular und schreibe für ein Editfeld eine OnChange Routine. Danach das andere Editfeld markieren, im Objektinspektor zu Events gehen. Wenn du mal genau schaust, ist rechts neben dem Eintrag OnChange eine DropDown Liste, wenn du diese jetzt aufklappst, steht da plötzlich die OnChange Routine des ersten Feldes. Also bei mir legt Delphi keine neue Routine an. ;)

Abgesehen davon würde es mich interessieren, wie du das mit einer Prozedur gelöst hättest: Eine Prozedur zum Addieren der einzelnen Werte und dann für jedes Editfeld eine eigne OnChange-Routine, in der die Prozedur aufgerufen wird? :-)


@Spreemy:
Dass du tatsächlich für jedes Editfeld eine eigene OnChange-Routine angelegt hast, verzeihe ich dir als Anfängerfehler. ;)
Trotzdem solltest du das oben Beschriebene einfach mal testen, um mit der Funktionsweise vertraut zu werden.
Seh ich das richtig, dass es automatisch die read/save prozedur beim starten/beenden des Programms ausführt?
Nein. Damit die Prozeduren ausgeführt werden, musst du deiner Anwendung natürlich noch mitteilen, wann sie diese Aufrufen soll. Dies kann z.B. im OnCreate und OnClose Ereignis des Formulars geschehen.
Dafür wieder den bereits beschriebenen Weg gehen: Formular markieren, im Objektinspektor auf Events gehen und dann jeweils doppelt auf den Eintrag OnCreate und OnClose klicken. Dort dann die entsprechenden Prozeduren aufrufen:

Code:
procedure TForm1.Form1Create(Sender: TObject);
begin
  ReadValues;
end;

procedure TForm1.Form1Close(Sender: TObject);
begin
  SaveValues;
end;

Alternativ zum OnClose Ereignis kann man die Prozedur SaveValues auch jedesmal beim Ändern der Eingabefelder mit aufrufen (Also hinter der Addition der einzelnen Felder). Dann würden z.B. auch nach einem Absturz die letzten Werte gespeichert sein. Allerdings musst du beachten, dass der Zugriff auf die Registry Rechenleistung benötigt. Wenn du also also eine schnelle Aktualisierungsfolge der Felder hast, könnte der Rechner eventuell ins schwitzen geraten. :(

Grüße Thomas
 
Hat so weit funktioniert, aber der geladene Wert wird einfach überschrieben, wenn ich auf die "+-" buttons drücke, was ja auch absolut logisch ist! Aber das soll ja nicht so sein.

Hab veruscht das so zu lösen.

Code:
Edit10.Text := FloatToStr(StrToFloat(Edit10.Text) + StrToFloat(Edit8.Text) - StrToFloat(Edit9.Text));
(Edit10 ist das Feld in das die werte ausgelesen werden)
Es passiert was! Aber das falsche.
 
Hat so weit funktioniert, aber der geladene Wert wird einfach überschrieben, wenn ich auf die "+-" buttons drücke, was ja auch absolut logisch ist! Aber das soll ja nicht so sein.
Uups, den Sachverhalt hatte ich gar nicht bedacht. :-(

Das Einfachste wäre alle Werte abzuspeichern und beim Öffnen wiederherzustellen.

Folgende Zeilen in SaveValues hinzufügen:
Code:
reg.WriteString('Wert1', Edit1.Text);
reg.WriteString('Wert2', Edit2.Text);
reg.WriteString('Wert3', Edit3.Text);
reg.WriteString('Wert4', Edit4.Text);
reg.WriteString('Wert5', Edit5.Text);
ReadValues entsprechend ändern:
Code:
if reg.OpenKey('Software\DeinWunschname', false) then begin
  Edit6.Text:=reg.ReadString('NochZuZahlen')
  Edit1.Text := reg.ReadString('Wert1');
  Edit2.Text := reg.ReadString('Wert2');
  Edit3.Text := reg.ReadString('Wert3');
  Edit4.Text := reg.ReadString('Wert4');
  Edit5.Text := reg.ReadString('Wert5');
end else begin
  Edit1.Text:='0';
  Edit2.Text:='0';
  Edit3.Text:='0';
  Edit4.Text:='0';
  Edit5.Text:='0';
  Edit6.Text:='0';
end;

Grüße Thomas
 
ne, ganz so hab ichs auch nicht gemeint. Also ich brauch nur den "nochzuzahlen" Wert.
Nehmen wir an, dieser beträgt "5". Dann wird er beim Programmstart geladen. Aber wenn ich jetzt auf "+" drücke, steht da nicht 6 sondern 1!

Also quasi, Alter "nochzuzahlen" - Wert + neuer Wert aus den Edit Feldern.
 
also, hab das jetzt durch einen Buttonclick gelöst. Geht einwandfrei.
Aber wie du vlt gesehen hast, hat mein Programm so Karteikarten. Dieses TabbedNotebook. Jetzt meine Frage. Wie kann ich per Click, eine neue Karte erstellen(mit allen Elementen), und für diese den Namen eingeben?
 
Zurück