[Gelöst] Daten werden nicht in record übernommen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

[Gelöst] Daten werden nicht in record übernommen

Beitrag von ConcAPPtLab »

Hallo Lazarusler :)

Lange Zeit ist's her, dass ich ein Problem hatte, nun bin ich wieder da. Und zwar mit ewas, was ich einfach nicht verstehe.

Ich wollte in einem record, welches folgendermaßen deklariert ist:

Code: Alles auswählen

TCharData = record
    Categ: array of string;
    Data: array of string;
    Check: array of integer;

Daten speichern. Nämlich einmal die Kategorie (der Titel des Datensatzes), dann die auswählbaren Optionen (werden später als Beschriftung für RadioButtons verwendet) und eine Nummer, die den Index des gewählten Buttons angibt. So weit, so gut.

Dann habe ich folgende Prozedur zum Schreiben von Daten:

Code: Alles auswählen

procedure TForm1.DataSave;
var CharData: TCharData;
    x: integer;
begin
 
  if Button1.Caption='Speichern' then
    begin
      x:=ListView1.ItemIndex;
    end
  else if Button1.Caption='Hinzufügen' then
    begin
      SetLength(CharData.Categ, 1);        //nur als Test eingebaut, damit überhaupt etwas in die Arrays geschrieben wird
      SetLength(CharData.Data, 1);
      SetLength(CharData.Check, 1);
      ShowMessage('CharData.Categ länge: '+IntToStr(Length(CharData.Categ)));    //Überprüfung
      x:=length(CharData.Categ)-1;
    end
 
  CharData.Categ[x]:=Edit3.Text;
   CharData.Data[x]:=Edit4.Text;
   CharData.Check[x]:=RadioGroup1.ItemIndex;
 
end;

Okay. Ist ja noch recht überschaubar. Funktioniert auch noch (laut der Messages die ich bekomme). Und wundert euch nicht über die SetLength()s. Die hab ich nur eingebaut um sichergehen zu können, dass ich überhaupt Werte in das Array geschrieben hab. Eigentlich wollte ich das im FormCreate machen, aber das funkt irgendwie nie (ich habe das Gefühl, dass diese Prozedur überhaupt nicht abgearbeitet wird). Vielleicht weiß ja jemand auch da Rat.

Das ist aber nicht das Problem, sondern viel eher diese Prozedur:
Das Abrufen der Daten:

Code: Alles auswählen

procedure TForm1.DataLoad;
var CharData: TCharData;
    x, i, n, z: integer;
begin
 
  x:=-1;
  n:=0;
 
  repeat
    x:=x+1;
    ShowMessage(IntToStr(length(CharData.Categ)));   //Nochmaliges Überprüfen, welche Infos jetzt drinnen sind -> FEHLER
    ShowMessage(IntToStr(ListView1.ItemIndex));
    ShowMessage(CharData.Categ[0]);
  until (CharData.Categ[x]=ListView1.Items.Item[ListView1.ItemIndex].Caption)
     or (x=length(CharData.Categ)-1);
 
  if CharData.Categ[x]<>ListView1.Items.Item[ListView1.ItemIndex].Caption then
    begin
      ShowMessage('Eintrag nicht in Datenbibliothek vorhanden!');
    end
  else
    begin
 
/////////////Ab hier Code uninteressant, da eh noch nicht prüfbar gewesen/////////////////////////////
 
      Edit3.Text:=CharData.Categ[x];
      RadioGroup1.ItemIndex:=CharData.Check[x];
 
      for z:=0 to RadioGroup1.Items.Count-1 do
        begin
          RadioGroup1.Items[z]:='';
        end;
 
      for i:=1 to length(CharData.Data[x]) do
        begin
          if CharData.Data[x][i]=',' then
            begin
              n:=n+1;
            end
          else if (CharData.Data[x][i]=' ') and (CharData.Data[x][i-1]=',') then
            begin
 
            end
          else
            begin
              RadioGroup1.Items[n]:=RadioGroup1.Items[n]+CharData.Data[x][i];
            end;
        end;
 
    end;
 
end;

Denn hier hat das Array nun keinerlei Werte mehr. Es ist null Datensätze lang. Kann mir jemand erklären, warum das so ist? Was habe ich falsch gemacht. Eigentlich habe ich schon öfters mit records und arrays gearbeitet. Dachte, jetzt hätte ich mich reingearbeitet. Irgendwie werden die Daten nicht richtig eingeschrieben oder ausgelesen.

Danke für alle Hinweise und LG :)
ConcAPPtLab
Zuletzt geändert von ConcAPPtLab am Di 16. Dez 2014, 21:20, insgesamt 1-mal geändert.
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: Daten werden nicht in record übernommen

Beitrag von wp_xyz »

Ich verstehe zwar kein Wort von dem, was du machen willst, aber wenn du in beiden Prozeduren DataLoad und DataSave dieselben Daten bearbeiten willst, darfst du die entsprechenden Records nicht lokal deklarieren, sonst sind sie ja der jeweils anderen Prozedur nicht bekannt. Deklariere CharData global, oder als Feld von TForm1.

In DataLoad insbesondere wird nicht die Länge der Arrays gesetzt.

Mathias
Beiträge: 6208
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Daten werden nicht in record übernommen

Beitrag von Mathias »

aber wenn du in beiden Prozeduren DataLoad und DataSave dieselben Daten bearbeiten willst, darfst du die entsprechenden Records nicht lokal deklarieren,

Das ist dein Fehler. Am Procedur-Ende von DataSave werden alle Daten wieder gelöscht, da sie nur lokal deklariert sind.

Noch etwas, wen ich den Code angucke sieht es aus, wie wen alle 3 Array gleich gross sind. wen das so ist, währe eine solche Deklaration besser.

Code: Alles auswählen

type
  TCharData = array of record
    Categ: string;
    Data: string;
    Check: integer;
  end;


Dann müsstest du SetLength nur einmal anstelle dreimal aufrufen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Daten werden nicht in record übernommen

Beitrag von ConcAPPtLab »

cool, danke leute. auch mit dem tip von wegen array of record. gut zu wissen. Vielen Dank :)

Grüße
ConcAPPtLab
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Antworten