Record platzsparend mit Daten füllen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Winnie
Beiträge: 4
Registriert: Do 8. Okt 2015, 18:40

Record platzsparend mit Daten füllen

Beitrag von Winnie »

Moin zusammen,

ich habe einen Datensatz, der aus 11 Einträgen unterschiedlichen Formats besteht (String, integer und double): Damit soll ein Messgerät angesteuert werden. Die Einträge bestehen u.a. aus den Koordinaten für die Messfläche und dem Namen der Messung. Ich habe also eine Matrix, deren Spalten aus dem Namen und Koordinaten bestehen, die Zeilen sind die Anzahl von Messungen mit unterschiedlichen Koordinaten.

Ich habe schon eine Vorlage, die ich aber etwas ändern möchte, da sie relativ viel Platz braucht und umständlich zu bedienen ist. Ich definiere z.B. die Daten für die erste Messung so:

Code: Alles auswählen

var
Name :String;
LinkerRand, RechterRand, ObererRand,UntererRand: double;
 
begin
Name[1]:='Messung 1';
LinkerRand[1]:=50;
RechterRand[1]:=100;
ObererRand[1]:=80;
UntererRand[1]:=60;
Dann kommen noch 6 weitere Einträge zu jedem Index[1] dazu.

Wenn ich jetzt z.B. 10 Messungen habe, nimmt das dann 10 * 11 Zeilen in Anspruch. Daher bin ich auf der Suche nach einer Möglichkeit, alle Daten für eine Messung in eine Zeile zu schreiben. Ungefähr so stelle ich mir das vor:

DataSet[1]:=('Messung 1', 50, 100, 80, 60);
DataSet[2]:=('Messung 2', 20, 40, 50, 30); usw.

Ich habe gelesen, dass ich für unterschiedliche Datenformate wohl einen "record" verwenden und diesen als Unit auslagern könnte. Ich habe dazu auch schon einen Entwurf, allerdings erhalte ich immer wieder Fehler. Daher erstmal meine Frage, ob es überhaupt möglich ist, ein Array/Record so innerhalb einer Zeile zu füllen.

Vielen Dank schon mal und freundliche Grüße
Winnie
Zuletzt geändert von Lori am Fr 9. Okt 2015, 16:34, insgesamt 1-mal geändert.
Grund: Highlighter

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

Re: Record platzsparend mit Daten füllen

Beitrag von Mathias »

Ich denke du suchst so was ?

Code: Alles auswählen

type
  TData = record
    Name: string;
    LinkerRand,
    RechterRand,
    ObererRand,
    UntererRand: double;
  end;
 
  TDataArray = array of TData;
 
var
  DataArray:TDataArray; 
 
begin
  SetLength(DataArray, 10); // bei 10 Messsungen
 
  DataArray[0].Name:='Hello Wordl';
  DataArray[0].LinkerRand:=10.4;
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Winnie
Beiträge: 4
Registriert: Do 8. Okt 2015, 18:40

Re: Record platzsparend mit Daten füllen

Beitrag von Winnie »

Hallo,

ja, dein Beispiel hatte ich auch schon ausprobiert, funktioniert auch, aber da muss ich aber immer noch jeden Eintrag einzeln in einer Zeile definieren. Gibt es sowas, dass ich alles in einer Zeile eingebe?

Wie z.B.: DataSet[1]:=('Messung 1', 50, 100, 80, 60);

sowas hatte ich mir auch schon mal gebastelt, wollte ich in eine Unit stecken:

Code: Alles auswählen

CreateDataSet(aName: String, L,T,R,H,P,MT,z,kV,uA: double,F: Char, const aCaption:String; aOwner:TComponent;aParent:TWinControl):TDataSet;  //Eigenbau
begin
   Result:=TDataSet.Create(aOwner);
   Result.Parent:=aParent;
   Result.SampleName:=aName;
   Result.Left:=L;
   Result.Top:=T;
   Result.Right:=R;
   Result.Bottom:=B;
   Result.PDistance:=P;
   Result.MeasuringTime:=MT;
   Result.ZPosition:=Z;
   Result.Voltage:=kV;
   Result.Current:=um;
   Result.Filter:=F;
   Result.Caption:=aCaption;
   Result.Checked:=aChecked;	
end;
Leider steckt da irgendwo noch ein Fehler drin.

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

Re: Record platzsparend mit Daten füllen

Beitrag von Mathias »

So wie ich sehe hast du function vergessen.

Code: Alles auswählen

  function DataSet(Name: string; LinkerRand, RechterRand, ObererRand, UntererRand: double): TData;
  begin
    Result.Name := Name;
    Result.LinkerRand := LinkerRand;
    Result.RechterRand := RechterRand;
    Result.ObererRand := ObererRand;
    Result.UntererRand := UntererRand;
  end;       

Code: Alles auswählen

 Result:=TDataSet.Create(aOwner);
Ist TDataSet eine Classe oder Record ?

Es wäre sowieso eleganter, wen du das Ganze mit einem Constructor in eine Classe packen würdest.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Winnie
Beiträge: 4
Registriert: Do 8. Okt 2015, 18:40

Re: Record platzsparend mit Daten füllen

Beitrag von Winnie »

Hi,

danke schon mal für die Hilfe. Ganz so viel Ahnung, wie der Code vielleicht vermuten lässt, habe ich leider nicht. Ich habe das aus einer Vorlage für meine Anwendung übertragen. Ich habe z.B. keine Ahnung, warum man diesen Part braucht:

Code: Alles auswählen

const aCaption:String; aOwner:TComponent;aParent:TWinControl
Und was bedeutet TData am Ende?

Vor ein paar Minuten habe ich bei der Recherche im Internet gelernt, dass es sowas wie Klassen gibt. Ich glaube aber, dass ich in meinem Fall mit dieser Kombination aus function und record auskomme(?). Wenn ich so den Datensatz innerhalb einer Zeile definieren kann, hätte ich mein Ziel ja erreicht ;)

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

Re: Record platzsparend mit Daten füllen

Beitrag von Mathias »

Dann gib in google mal function ein.

Das axxx kannst weglassen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Winnie
Beiträge: 4
Registriert: Do 8. Okt 2015, 18:40

Re: Record platzsparend mit Daten füllen

Beitrag von Winnie »

Ok, mit der Funktion bekomme ich den Fehler "Unknown Type 'TData'.

Was hat es damit auf sich? Ich habe schon gegoogelt, aber dazu nichts verständliches gefunden.

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Record platzsparend mit Daten füllen

Beitrag von theo »

An deiner Stelle würde ich mal mit Pascal lernen anfangen:
z.B. hier http://www.marcocantu.com/epascal/German/default.htm

Hier gibt's auch noch Links:
http://www.lazarusforum.de/viewtopic.php?f=21&t=79
http://www.delphi-treff.de/

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

Re: Record platzsparend mit Daten füllen

Beitrag von Mathias »

Gucke mal mein erster Post an, dann siehst du wasTData ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten