Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datenbank überschreibt inhalte (https://www.delphipraxis.net/160546-datenbank-ueberschreibt-inhalte.html)

Picard95 18. Mai 2011 18:13

Delphi-Version: 5

Datenbank überschreibt inhalte
 
Hallo zusammen,
Ich bin grad am verzweifeln:pale:
Ich habe in meinem Aktuellen Programm eine Datenbank (in seperater Unit) welche instanzen vom Inhalt bei Start des Programmes erzeugt.
Ich habe soeben herrausgefunden (Per showmessage), dass das Programm den ersten Eintrag in der Datenbank überschreibt, und ich so immer die gleiche Augabe erhalte.
Was mich wundert: nachdem ich per doppel/ die Zeile "unsichtbar" gemacht habe welche das eintragen der letzten daten in die Datenbank beinhaltet kam immernoch der gleiche Inhalt:?:.
Ich würde mich sehr über hilfreiche (und für mich verständliche) Hilfe freuen.
Anbei nun die Quellcodes der entsprechenden Stellen.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Atom:TAtom;
  Hilf:real;
begin
  //hier steht das folgende noch 2 mal nur das es eingetragen wird!
  Atom.set_Atomname('Lithium');
  Atom.set_Atomsymbol('Li');
  Atom.set_Atomserie('Erdalkalimetalle');
  Atom.set_Atomaussehen('XXXX');
  Atom.set_Atomaggregatzustand('Fest');
  Atom.set_Atomgefahren1('XXXX');
  Atom.set_Atomordnungszahl(3);
  Atom.set_Atommasse(7);
  Atom.set_Atomschmelztemperatur(180);
  Atom.set_Atomsiedetemperatur(1372);
  Atom.set_Atomdichte(0.534);
  Atom.set_AtomEN(1.0);
  Atom.set_Atomoxidationszahl1(1);
  //Periodensystem.Hinzufuegen(Atom);
  showmessage('LI');
  end;
Das steh in der Formcreate der Unit1
Delphi-Quellcode:
procedure TForm2.Button26Click(Sender: TObject);
begin
  Abkuerzung:=1;
  Form3.Trage_ein;
  Form3.showmodal;
end;
//...
Das war Unit2
Delphi-Quellcode:
begin
  Atomzahl:=unit2.Abkuerzung;
  Periodensystem.Ausgabe(Listbox1,Listbox2,Listbox3,Listbox4,Listbox5,Atomzahl);
end;
Das war unit3
Delphi-Quellcode:
constructor TPeriodensystem.create;
  begin
    Anzahl:=1;
    inherited create;
  end;

procedure TPeriodensystem.Hinzufuegen(X:TAtom);
  var I:integer;
  begin

    showmessage(inttostr(Anzahl));
    if Anzahl=3
    then
    for I:=1 to 2 do
    showmessage(inhalt[1].get_Atomname);
    Inhalt[Anzahl]:=x;Anzahl:=Anzahl+1;
  end;
Und das die UPeriodensystem.

Ich danke schonmal für die Antworten.

shmia 18. Mai 2011 18:22

AW: Datenbank überschreibt inhalte
 
Was ist das denn?
Delphi-Quellcode:
for I:=1 to 2 do
   showmessage(inhalt[1{<== Hier sollte wohl Schleifenvariable I stehen}].get_Atomname);

Picard95 18. Mai 2011 18:26

AW: Datenbank überschreibt inhalte
 
das wird später rausgenommen... hab ich quasi zur fehlersuche eingebaut.
Wobei sich halt herrausstellt, dass der inhalt immer gleich ist.
Wenn dann die letzte eintragung oben wieder sichtbar gemacht wird, dann sieht man (wenn I da steht) das für den inhalt1 und 2 der gleiche name angegeben wird (welcher ja eigentlich unterschiedlich ist);

shmia 18. Mai 2011 18:32

AW: Datenbank überschreibt inhalte
 
Zitat:

Zitat von Picard95 (Beitrag 1101608)
Wobei sich halt herrausstellt, dass der inhalt immer gleich ist.

Das ist doch logisch, weil du immer auf inhalt[1] anstatt auf inhalt[I] zugreifst.

Picard95 18. Mai 2011 18:38

AW: Datenbank überschreibt inhalte
 
ja gut aber selbst wenn ich es tue der inhalt 1 sollte anders sein da (ich vergas es glaub ich zu erwähnen) der Inhalt 1.get_Atomname Wasserstoff beinhalten sollte und nicht Litihum!
zudem: wenn ich die Variable I einsetzte, dann erscheint 2* Lithium obwohl einmal Wasserstoff und einmal Helium die richtigen inhalte wären. Und bei der Ausgabe aus dem Periodensystem in meine Form3 erhalte ich 3 mal das gleich und nicht 3 verschiedene

DeddyH 18. Mai 2011 19:01

AW: Datenbank überschreibt inhalte
 
Wie ist denn Inhalt deklariert?

Picard95 18. Mai 2011 19:08

AW: Datenbank überschreibt inhalte
 
Delphi-Quellcode:
Type TPeriodensystem = class
             inhalt:array[1..112]of TAtom;
             Anzahl:integer;
             constructor create;
             procedure Hinzufuegen(x:TAtom);
             procedure Ausgabe(L1,L2,L3,L4,L5:TListbox;X:integer);
             end;
Um mal die complette Deklaration der Elemente von TPeriodensystem anzuzeigen...
Was ich grade ausprobiert habe:
wenn ich eine showmessage in Unit 1 vor dem eintragen der Informationen zu Lithium gebe, dann bekomme ich auch Lithium als ausgabe für den inhalt der beiden vorherigen Infos... was mich wundert, denn das Periodensystem kann die da noch garnicht kennen...

shmia 18. Mai 2011 19:09

AW: Datenbank überschreibt inhalte
 
Du hast auch noch weitere Probleme in deinem Sourcecode.
Da du Delphi4 verwendest vermute ich dass TAtom eine Klasse und kein Record ist.
Daher muss jedes Objekt von TAtom neu erzeugt werden:
Delphi-Quellcode:
procedure procedure TForm1.ErzeugeSauerstoff;
var
  atom : TAtom;
begin
  atom := TAtom.Create; // neues Objekt erzeugen
  atom.Atomname := 'Sauerstoff';
  ... // hier weitere Eigenschaften bestücken
  Periodensystem.Hinzufuegen(atom);
end;
Wenn du dagegen nur ein einziges Objekt der Klasse TAtom hast (globale Variable ?),
dann ist klar, dass immer das gleiche Objekt mit den Daten überbügelt wird.

DeddyH 18. Mai 2011 19:12

AW: Datenbank überschreibt inhalte
 
Was kommt hierbei heraus?
Delphi-Quellcode:
procedure TPeriodensystem.Hinzufuegen(X:TAtom);
var I:integer;
begin
  if Anzahl <= High(Anzahl) then
    begin
      Inhalt[Anzahl]:=x;
      Anzahl:=Anzahl+1;
      for I:= 1 to Anzahl do
        showmessage(inhalt[I].get_Atomname);  
    end;
end;

Picard95 18. Mai 2011 19:14

AW: Datenbank überschreibt inhalte
 
also meines wissens habe ich das im hauptprogramm gemacht.... aber ich fürchte in der UPeriodensystem nicht.....
@DebbyH: ne Fehlermeldung:-D


ähm wo muss ich denn dann(und vorallem wie) den inhalt[X] kreiren

DeddyH 18. Mai 2011 19:16

AW: Datenbank überschreibt inhalte
 
Na super, und welche?

jobo 18. Mai 2011 19:41

AW: Datenbank überschreibt inhalte
 
OT:
Ihr seid ja echt geduldig! DebbyH und wie sie alle heißen! ;)
Und Fehler an sich reichen doch zur Feststellung, dass es nicht geht. Wen interessieren Details?

Picard95 18. Mai 2011 19:45

AW: Datenbank überschreibt inhalte
 
"Project Project1.exe raised exception class EAccessViolation with message 'Acces violation at address 00442588 in modul 'Project1.exe'. Read of 00000004' Proces stopped.[...]"und dann halt noch das ich start drücken soll oder so

@shmia:
wenn ich Inhalt allerdings als array deklariere kreiert das System automatisch Instanzen von TAtom.
Hab grad nochmal nachgeschaut

hoika 18. Mai 2011 20:57

AW: Datenbank überschreibt inhalte
 
Hallo,

Read of 00000004
-> NIL-Zugriff

F5/F7/F8 benutzen

ob TAtom eine Klasse oder ein Record ist,
hast du noch nicht erklärt ...


Heiko
"Es geht nicht" , ist keine Fehlerbeschreibung ...

Picard95 18. Mai 2011 21:00

AW: Datenbank überschreibt inhalte
 
oh sorry hatte ich vergessen... TATom ist eine Klasse mit einer eigenen Unit...

DeddyH 18. Mai 2011 21:20

AW: Datenbank überschreibt inhalte
 
Wenn es eine Klasse ist, musst Du die Objekte dieser Klasse auch erzeugen (und später wieder freigeben), von allein geschieht das nicht.

hoika 18. Mai 2011 21:33

AW: Datenbank überschreibt inhalte
 
Hallo,

eine Klasse also ...
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Atom:TAtom;  // Klassenvariable, also ein Poimter
  Hilf:real;
begin

  // Klasse wird nicht erzeugt

  //hier steht das folgende noch 2 mal nur das es eingetragen wird!
  Atom.set_Atomname('Lithium');  // Schutz-Verletzung  na klar, Klasse nicht erzeugt
  Atom.set_Atomsymbol('Li');
  Atom.set_Atomserie('Erdalkalimetalle');
  Atom.set_Atomaussehen('XXXX');
  Atom.set_Atomaggregatzustand('Fest');
  Atom.set_Atomgefahren1('XXXX');
  Atom.set_Atomordnungszahl(3);
  Atom.set_Atommasse(7);
  Atom.set_Atomschmelztemperatur(180);
  Atom.set_Atomsiedetemperatur(1372);
  Atom.set_Atomdichte(0.534);
  Atom.set_AtomEN(1.0);
  Atom.set_Atomoxidationszahl1(1);
  //Periodensystem.Hinzufuegen(Atom);
  showmessage('LI');
  end;

Was soll der ganze Code bewirken ???
Speichern ???
Wo denn ???


Heiko

Sir Rufo 18. Mai 2011 23:28

AW: Datenbank überschreibt inhalte
 
Wieso eigentlich diese Methoden zum Setzen der Eigenschaftswerte?
Da wären doch Properties wesentlich einfacher in der Handhabung

Neumann 19. Mai 2011 06:09

AW: Datenbank überschreibt inhalte
 
Hallo,

warum die ganze Sache so kompliziert?

Man nehme für eine einzelne Tabelle ein Clientdataset, legt die entsprechenden Felder an und kann dann auch noch ohne Mühe die Daten speichern und laden, in einem DBGrid darstellen, sortieren, Datensätze suchen usw.

Auch die Anzeige mit Listboxen kann man dann machen, was mir persönlich auch nicht so besonders gefällt.

Gruß

Ralf

Picard95 19. Mai 2011 15:00

AW: Datenbank überschreibt inhalte
 
also das ganz ist so "kompliziert" weil ich es leider nicht anders in der schule gelernt habe...
des weiteren: die Speicherung der Staen erfolgt zur eingabe in die Datenbank. Hierzu wird eine Instanz des zu verwaltenden Objects erzeugt (siehe Atom (ist allerdings nicht in dem ausschnitt angezeigt)) und dann wird diese Insatnz per lokaler Variable in die procedur "Hinzufügen" der Datenbank reingestellt...
@hoika: was für eine Verletzung? Ich erstelle die klasse das ist nur da nicht drauf:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Atom:TAtom;
  Hilf:real;
  I:integer;
begin
 Periodensystem:=TPeriodensystem.create;
 showmessage('createP');
 Atom:=TAtom.create;

{...}

DeddyH 19. Mai 2011 15:03

AW: Datenbank überschreibt inhalte
 
Und wie viele davon? Du musst natürlich je Eintrag in Deine Liste eine Instanz erzeugen.

[edit] Oder wenn Du sowieso immer 112 Instanzen brauchst, kannst Du sie ja gleich von vornherein anlegen.
Delphi-Quellcode:
constructor TPeriodensystem.Create;
var
  i: integer;
begin
  inherited;
  for i := Low(inhalt) to High(inhalt) do
    inhalt[i] := TAtom.Create;
  //usw.
end;

destructor TPeriodensystem.Destroy;
var
  i: integer;
begin
  for i := Low(inhalt) to High(inhalt) do
    inhalt[i].Free;
  //usw.
  inherited;
end;
[/edit]

Picard95 19. Mai 2011 15:06

AW: Datenbank überschreibt inhalte
 
ich habe inn der Formcreate nur eine einzige Instanz die immer wieder überschrieben wird und dann mit neuem Inhalt wieder in die Datenbank eingetragen wird... und meiner Kenntniss nach muss ich den Inhalt der Datenbank nicht kreeren, da der Computer dies Atuomatisch bei der dekleration array macht...
Soll ich mal den Kompletten Quelltext (ausser den unzähligen gleichen stellen in Unit2) hier reinsetzten?

DeddyH 19. Mai 2011 15:11

AW: Datenbank überschreibt inhalte
 
Von welcher Datenbank redest Du eigentlich ständig?

Picard95 19. Mai 2011 15:35

AW: Datenbank überschreibt inhalte
 
ich meine die TPeriodensystem ist ne Datenbank von der Struktur her

DeddyH 19. Mai 2011 15:44

AW: Datenbank überschreibt inhalte
 
Ich verstehe unter Datenbank etwas anderes, aber egal. Hast Du mein Edit in #21 gelesen?

Picard95 19. Mai 2011 15:52

AW: Datenbank überschreibt inhalte
 
jetzt ja
dazu ne Frage: ich denke mal inhalt[I].free giebt mir dann die instanz wieder frei.... und was bedeutet dieses Low bzw high das hatte ich noch nicht im unterricht.
desweiteren: meine Datenbank überschreibt ja meine inhalte wenn ich einen weiteren hinzufüge also 1 wird überschrieben wenn ich 2 eingebe 1 und 2 wenn ich 3 eingebe usw. wie kann ich das verhindern? das hat alles mal in einer anderen version in der schule gekleppt nur jetzt eben nicht und den fehler find ich leider nicht

DeddyH 19. Mai 2011 15:57

AW: Datenbank überschreibt inhalte
 
Nochmal zum Verständnis: eine Objektinstanz ist intern nichts anderes als ein Zeiger. Legst Du also nur eine Instanz an, änderst da etwas und merkst Dir diese Instanz in Deinen Array-Elementen, so zeigen diese alle auf ein und dasselbe Objekt. Wenn Du das nicht willst, musst Du eben so viele Instanzen anlegen, wie Dein Array Felder besitzt. Und genau das habe ich in meinem geposteten Code getan.

Picard95 19. Mai 2011 16:06

AW: Datenbank überschreibt inhalte
 
ich erstelle eine instanz in der unit 1 schreibe daten rein und speichere die in einer andere Instanz in der UPeriodensystem dann ändere ich die instanz in U1 und speichere die in der 2. instanz in UP

DeddyH 19. Mai 2011 16:08

AW: Datenbank überschreibt inhalte
 
Davon habe ich aber bislang nichts gesehen. Wo kommen die anderen Instanzen denn her?

Picard95 19. Mai 2011 16:09

AW: Datenbank überschreibt inhalte
 
inhalt ist ja ein array ein array beschreibt mehrere instanzen der gleichen klasse

DeddyH 19. Mai 2011 16:11

AW: Datenbank überschreibt inhalte
 
Nein! Was Dein Array enthält, sind lediglich Zeiger und keine Daten. Die Objekte musst Du selbst anlegen, das ist nicht so wie bei primitiven Datentypen wie Integer oder Char.

Picard95 19. Mai 2011 16:24

AW: Datenbank überschreibt inhalte
 
hast du nen quellcode für mich?
ich habs so aber auch mal geschaft
((ANDERES PROGRAMM))
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
 begin
          Artikel:=TArtikel.create;
          Hilf:=edit1.text;
          Artikel.set_Art_Nr(Hilf);
          Hilf:=edit2.text;
          Artikel.set_Art_Bez(Hilf);
          PHilf:=strtofloat(edit3.text);
          Artikel.set_Preis(PHilf);
          AHilf:=strtoint(edit4.text);
          Artikel.set_Anzahl(AHilf);
          Pool.Hinzufuegen(Artikel);
          Pool.Ausgabe(Listbox1);
end;
Delphi-Quellcode:
Type TPool = class
             inhalt:array[1..100000]of TArtikel;
             Anzahl:integer;
             constructor create;
             procedure Hinzufuegen(x:TArtikel);
             procedure Ausgabe(x:TListbox);
             procedure Art_Suche(Art_Nr:string;L:TLabel);
             procedure Sortieren_Nr(L:TListbox);
             procedure Sortieren_Bez(L:TListbox);
             end;
implementation
constructor TPool.create;
  begin
    Anzahl:=0;
    inherited create;
  end;
procedure TPool.Hinzufuegen(x:TArtikel);
  begin
    Anzahl:=Anzahl+1;
    Inhalt[Anzahl]:=x;
  end;
procedure TPool.Ausgabe(x:TListbox);
  var Produkt:integer; Hilf1,Hilf2,Hilf3,Hilf4:string;
  begin
    x.clear;
    for Produkt:=1 to Anzahl do
      begin
        Hilf1:=inhalt[Produkt].get_Art_Nr;
        Hilf2:=inhalt[Produkt].get_Art_Bez;
        Hilf3:=floattostr (inhalt[Produkt].get_Preis);
        Hilf4:=inttostr (inhalt[Produkt].get_Anzahl);
        x.items.add(Hilf1+' - '+Hilf2+' - '+Hilf3+' - '+Hilf4)
      end;
   end;
[Edit]und dieses Programm hat funktioniert[/EDIT]

DeddyH 19. Mai 2011 16:35

AW: Datenbank überschreibt inhalte
 
Da hast Du ja auch bei jedem Klick ein neues Objekt erstellt, hier aber nicht. Mal angenommen, Du baust ein Haus und streichst es weiß an. Den Schlüssel legst Du in eine Schachtel. Nun legst Du einen zweiten Schlüssel zu diesem Haus in eine andere Schachtel und streichst das Haus grün. Wenn Du nun den Schlüssel aus der ersten Schachtel nimmst, kannst Du damit das weiße Haus aufschließen?

[edit] Den Quellcode habe ich doch bereits gepostet, statt mit mir zu diskutieren hättest Du den ja einmal ausprobieren können ;) [/edit]

Bummi 19. Mai 2011 16:36

AW: Datenbank überschreibt inhalte
 
weil Du hier
Delphi-Quellcode:
procedure TPool.Hinzufuegen(x:TArtikel);
  begin
    Anzahl:=Anzahl+1;
    Inhalt[Anzahl]:=x;
  end;
ein Objekt übergibst, welches Du vorher erzeugt haben musst.

DeddyH 19. Mai 2011 16:37

AW: Datenbank überschreibt inhalte
 
Genau davon rede ich doch die ganze Zeit.

Picard95 19. Mai 2011 16:39

AW: Datenbank überschreibt inhalte
 
ah danke habe einfach vor jeden Block nochmal die zeile
Delphi-Quellcode:
Atom:=TAtom.create;
geschrieben jetzt geht es.
Danke für die Hilfe

DeddyH 19. Mai 2011 16:44

AW: Datenbank überschreibt inhalte
 
Hoffentlich gibst Du die Objekte aber zum Schluss auch wieder frei.

Picard95 19. Mai 2011 17:01

AW: Datenbank überschreibt inhalte
 
in einer Ausgabe? also so wie ich es jetz mache geht es
Delphi-Quellcode:
Atom:=TAtom.create;
//...
  Atom.set_Atomname('Natrium');
  Atom.set_Atomsymbol('Na');
  Atom.set_Atomserie('Erdalkalimetalle');
  Atom.set_Atomaussehen('silbrig weiß');
  Atom.set_Atomaggregatzustand('Fest');
  Atom.set_Atomgefahren1('Leichtentzündlich (F)');
  Atom.set_Atomgefahren2('Ätztend (C)');
  Atom.set_Atomordnungszahl(11);
  Atom.set_Atommasse(23);
  Atom.set_Atomschmelztemperatur(97.72);
  Atom.set_Atomsiedetemperatur(883);
  Atom.set_Atomdichte(0.968);
  Atom.set_AtomEN(0.93);
  Atom.set_Atomoxidationszahl1(1);
  Periodensystem.Hinzufuegen(Atom);
//...

Bummi 19. Mai 2011 17:06

AW: Datenbank überschreibt inhalte
 
z.B. im Destructor von Periodensystem
Delphi-Quellcode:
for i := Low(AA) to High(AA) do if Assigned(AA[i]) then AA[i].free;

mkinzler 19. Mai 2011 17:08

AW: Datenbank überschreibt inhalte
 
Oder
Delphi-Quellcode:
FreeAndNil(AA[i]);


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz