AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array mit verschiedenen Records

Ein Thema von Scrutor · begonnen am 4. Jul 2007 · letzter Beitrag vom 6. Jul 2007
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von Billa
Billa

Registriert seit: 11. Aug 2003
237 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#21

Re: Array mit verschiedenen Records

  Alt 5. Jul 2007, 12:13
uppsss.. laufen denn die Fortran-Programme parallel weiter? In solchen Umgebungen gibt es i.d.R. noch mehr "Dinosaurier", deshalb könnte eine solche Routine mehrfach verwendet werden. In meinem Job haben wir es aus historischen Gründen mit dBase und Dataease-Dateien aus mehreren Projekten zu tun. (eigene und von Kunden) Also haben wir uns die Mühe EINMAL gemacht und einen Konverter nach SQL geschrieben. Der wird über Textdateien gesteuert. Das Ding taugte bisher für ca ein Dutzend Migrationsprojekte. Aber das scheint ein anderer Fall zu sein.

Wenn Du sowieso später neue Datenstrukturen entwickeln willst, lohnt sich der Aufwand vielleicht wirklich nicht. Ich ziehe es allerdings vor, im Klartext lesbare Steuerdateien zu verwenden, statt verschachtelte Klassen und Objekte. Nach spätestens einem halben Jahr taucht dann doch ein Fall auf, wo das ohne Zweifel elegante Konstrukt dann doch nicht mehr passt. Ich will Dich nicht überreden, aber Wiederverwendbarkeit ist ein n icht zu unterschätzender Kosten- und Zeitvorteil. Viel Erfolg jedenfalls. An dieser Stelle klinke ich mich aus. ...muß ja schließlich ein bißchen was arbeiten....
Gruß Billa

Nur weil ich paranoid bin, heißt das nicht, daß die da draussen nicht hinter mir her sind....
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#22

Re: Array mit verschiedenen Records

  Alt 5. Jul 2007, 12:41
Was haltet ihr von einem array of pointer? Also ungefähr so:
Delphi-Quellcode:
type
TRec1=record //alter Record
//
end;
PRec1=^TRec1;
TRec2=record //neuer Record;
//
end;
PRec2=^TRec2;
var alteversion: boolean; Daten:array[0..9] of pointer;//Größe des Arrays natürlich beliebig
    groesse:integer; //abhängig von alteVersion auf sizeof(TRec1) oder sizeof(TRec2) gesetzt

//Jetzt erstmal alteVersion und Groesse richtig setzen. Dann für jedes Element von Daten mit getmem genau so viel Speicher allozieren, wie für den benutzten Record gebraucht wird. Beim auslesen dann in den entsprechenden Zeigertyp casten

for i:=0 to 9 do
  getmem(array[i],groesse)
//Jetzt einlesen
meinStream.read(array[i]^,groesse);

//Verwendung:
if alteVersion then
  begin
    PRec1(Daten[0])^ //Und irgendwas damit machen
  end
else
  begin
    PRec2(Daten[0])^ //Und irgendwas damit machen
  end;

//Am Ende natürlich freemem nicht vergessen
Ist natürlich relativ viel Code, da du oft alteVersion abfragen musst, aber du kannst dir ja Funktionen bauen, die das automatisieren.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Scrutor

Registriert seit: 23. Sep 2006
Ort: Moers
37 Beiträge
 
Turbo Delphi für Win32
 
#23

Re: Array mit verschiedenen Records

  Alt 5. Jul 2007, 13:30
so, ich hab mir nun was ganz anderes einfallen lassen, was meiner meinung nach auch am einfachsten ist.

ich habe nun 6 verschiedene records, also für jeden Datumsfall ein extra record.

nur jetzt steh ich wieder auf dem schlauch, wie kann ich die denn jetzt zuordnen ?


Delphi-Quellcode:
...
var
  Data0:TDaten_0;
  Data1:TDaten_1;
  Data2:TDaten_2;
  Data3:TDaten_3;
  Data4:TDaten_4;
  Data5:TDaten_5;

...

  Format:=0;
  CreateDate:=StrToDate(FormatDateTime('dd.mm.yy',GetFileModifyDate(Fread)));
  if CreateDate<StrTodate('22.01.04') then Format:=1;
  if CreateDate<StrTodate('23.07.03') then Format:=2;
  if CreateDate<StrTodate('21.02.02') then Format:=3;
  if CreateDate<StrTodate('27.04.01') then Format:=4;
  if CreateDate<StrTodate('31.10.00') then Format:=5;
  case Format of //format wählen
    0: begin
         //benutze "Data0" record
         DataArray[0]:=Data0;
         groesse[0]:=Sizeof(TDaten_0);
       end;
    1: begin
         //benutze "Data1" record
       end
    else
     begin
       ShowMessage('Format wird noch nicht unterstützt.');
       exit;
     end;
  end;

  fStream:=TMemoryStream.Create;
  try
    fStream.LoadFromFile(Fread);

    fStream.ReadBuffer(DataArray[0],sizeof(groesse[0]));
    {fStream.ReadBuffer(DataZ2,SizeOf(DataZ2));
    fStream.ReadBuffer(DataZ3,SizeOf(DataZ3));
    fStream.ReadBuffer(DataZ4,SizeOf(DataZ4));}


      // fStream.ReadBuffer(DataZ5,SizeOf(DataZ5));
  finally
    fStream.Free;
  end;
 
  EditIdVor.Text:=trim(DataArray[0].IdVorr);
90% aller Computerprobleme sitzen vor dem Bildschirm !
  Mit Zitat antworten Zitat
Scrutor

Registriert seit: 23. Sep 2006
Ort: Moers
37 Beiträge
 
Turbo Delphi für Win32
 
#24

Re: Array mit verschiedenen Records

  Alt 6. Jul 2007, 09:02
es ist zum verzweifeln, ich komme einfach nicht weiter.

ist es vielleicht möglich eine Variable dynamisch zuzuordnen ?

also beispielsweise im Prinzip so:
Delphi-Quellcode:
var
   Data : ???;
begin
  case Format of
   0: Data:=TDaten_0;
   1: Data:=TDaten_1;
  end;
end;
ich weiss einfach nicht wie ich das machen soll


mfg
Scrutor
90% aller Computerprobleme sitzen vor dem Bildschirm !
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: Array mit verschiedenen Records

  Alt 6. Jul 2007, 09:17
Ja, du kannst es dynamisch zuordnen. Da musst du den Speicher selbst verwalten.

Prinzip:
Delphi-Quellcode:
type TDaten1=record
...

var typ:array of byte;
    DatenArray:Array of pointer;


procedure readversion1(const Stream:Tstream;pos:integer);
var Daten1:^TDaten1;
begin
  new(Daten1) //Speicher reservieren
  stream.read(Daten1^,sizeof(TDaten1);
  
  Datenarray[pos]:=Daten1;
  typ[pos]:=1; //du musst dir ja merken, an welcher Stelle du welchen Typ von record hast
end;

procedure readversion2.....

//zugriff
  Daten1:=Datenarray[pos];
  showmessage(Daten1^.xyz);




//am Ende speicher mit dispose freigeben
  case typ[pos] of
    1: begin
         Daten1:=Datenarray[pos];
         dispose(Daten1);
...
Anmerkung du kannst dir auch gleich einen Typ machen


So, ich muss erstmal los....
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Scrutor

Registriert seit: 23. Sep 2006
Ort: Moers
37 Beiträge
 
Turbo Delphi für Win32
 
#26

Re: Array mit verschiedenen Records

  Alt 6. Jul 2007, 10:19
danke sirius,

aber irgendwie versteh ich nicht so ganz was du da machst bzw. vorhast.

wieso "procedure readversion2....."

blick da nicht so durch .



mfg
Scrutor
90% aller Computerprobleme sitzen vor dem Bildschirm !
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#27

Re: Array mit verschiedenen Records

  Alt 6. Jul 2007, 10:36
Hallo,

ich denke, du gehst falsch heran.
Das einfachste ist doch, wenn du die alten Daten in das neue Format konvertierst
und dann nur mit dem neuen arbeitest.

Ausnahme: Das alte Fortran-Programm läuft immer noch.

In diesem Fall würde ich auf jeden Fall auf Klassen umsteigen.
Trenne das Lesen der Daten von deinen internen Datenstrukturen.

Delphi-Quellcode:
type
  TDataItem = class
    public
      iVersion : Integer; // 1-6 ?
      sProjectNo : String;
  end;
Zum Lesen benutzt du deine Records,
schreibst die Daten aber dann in das TDataItem rein

Jetzt gibt es nur noch einen Unterschied beim Lesen und Schreiben.
In deinem Code benutzt du nur das TDataItem.


Heiko
Heiko
  Mit Zitat antworten Zitat
Scrutor

Registriert seit: 23. Sep 2006
Ort: Moers
37 Beiträge
 
Turbo Delphi für Win32
 
#28

Re: Array mit verschiedenen Records

  Alt 6. Jul 2007, 10:42
Hallo hoika,

also das alte Fortran-Programm ist natürlich noch im Dienst und soll auch vorerst parallel weiterlaufen können,
deswegen mach ich mir ja diese Arbeit.

Mit den Klassen hab ich das noch nicht geschnallt. Bin erstmal grad nun noch dran mit Pointern zu arbeiten.

es muss doch irgendwie auch so gehen



mfg
Scrutor
90% aller Computerprobleme sitzen vor dem Bildschirm !
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#29

Re: Array mit verschiedenen Records

  Alt 6. Jul 2007, 11:14
Ich und Sirius meinten prinzipiell das selbe. Die unterschiedlichen Readversions bei Sirius gibt es, damit du in einem Fall readversion1 aufrufst und im anderen Fall readversion2. Sirius kapselt das, was ich mittendrin gemacht habe. Du machst also von deiner Version abhängig, welche Funktion du aufrufst.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Scrutor

Registriert seit: 23. Sep 2006
Ort: Moers
37 Beiträge
 
Turbo Delphi für Win32
 
#30

Re: Array mit verschiedenen Records

  Alt 6. Jul 2007, 11:19
ich bekomme aber nichts von alledem an meinem beispiel zum laufen.

weder deinen ansatz noch den von sirius.

entweder klappt das nicht, oder ich hab einfach nur irgendwo nen denkfehler
90% aller Computerprobleme sitzen vor dem Bildschirm !
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 11:41 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