Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datei von Programmversion abhängig machen (https://www.delphipraxis.net/143147-datei-von-programmversion-abhaengig-machen.html)

Kunoishi 10. Nov 2009 20:44


Datei von Programmversion abhängig machen
 
Ich habe eine Dat-Datei welche ich von der Versionsnummer meines Programmes abhängig machen möchte.
Also wenn ich mein Programm starte und auf die Dat-Datei zugreife, soll das Programm prüfen, ob die
Dat-Datei mit dieser Programmversion auch erstellt wurde.

So die Idee :-)

Ihr Habt mir hier im Forum schon mal mit der Versionsauslesung geholfen
dazu habe ich in meinem Programm den Code eingearbeitet der auch klasse ist.
Delphi-Quellcode:
procedure TAboutBox.GetVersionInfo(const AFilename:String);
const
  cCaptions : array[0..5] of String =
    ('Firmenname','Interner Name','Original-Dateiname','Produktname',
     'Produktversion','Sprache');
  cIdents : array[0..4] of String =
    ('CompanyName','InternalName','OriginalFilename','ProductName','ProductVersion');

type
  PLanguageCharSet = ^TLanguageCharSet;
  TLanguageCharSet = packed record L,C : Word end;

var
  V1, V2, V3, V4  : Word;
  VerInfoSize    : Integer;
  VerValueSize   : DWord;
  VerInfo        : Pointer;
  VerValue       : PVSFixedFileInfo;
  BufLen         : DWord;
  LanguageCharSet : PLanguageCharSet;
  s              : String;
  i              : Integer;

function GetStringValue(const AIdent:String):String;
var
  BufLen : DWord;
  p     : Pointer;
begin
  if VerQueryValue(VerInfo,
                   PChar(Format('\StringFileInfo\%.4x%.4x\%s',
                                [LanguageCharSet^.L,LanguageCharSet^.C,AIdent])),
                   p,BufLen) and (BufLen>0) then begin
    SetString(Result,PChar(p),BufLen-1);
  end
  else begin
    Result:='';
  end;
end;

begin
  VerInfoSize:=GetFileVersionInfoSize(PChar(AFilename),BufLen);
  if VerInfoSize>0 then begin
    GetMem(VerInfo,VerInfoSize);
    try
      if GetFileVersionInfo(PChar(AFilename),0,VerInfoSize,VerInfo) then begin
        if VerQueryValue(VerInfo,'\',Pointer(VerValue),VerValueSize) then
         with VerValue^ do begin
          V1:=dwFileVersionMS shr 16;
          V2:=dwFileVersionMS and $FFFF;
          V3:=dwFileVersionLS shr 16;
          V4:=dwFileVersionLS and $FFFF;
          LblDateiVersionN.Caption:=Format('%d.%d.%d.%d',[V1,V2,V3,V4]);

        end;
        if VerQueryValue(VerInfo,
                         '\VarFileInfo\Translation',
                         Pointer(LanguageCharSet),BufLen) then begin
          LblDateiVersion.Caption:=GetStringValue('FileVersion');
          LblBeschreibung.Caption:=GetStringValue('FileDescription');
          LblCopyright.Caption:=GetStringValue('LegalCopyright');
          with StringGrid1 do begin
            ColWidths[0]:=100;
            ColWidths[1]:=300;
            for i:=0 to 4 do begin
              Cells[0,i]:=cCaptions[i];
              Cells[1,i]:=GetStringValue(cIdents[i]);
            end;
            SetLength(s,100);
            BufLen:=VerLanguageName(LanguageCharSet.L,PChar(s),100);
            if BufLen>0 then begin
              SetLength(s,StrLen(PChar(s)));
              Cells[0,5]:=cCaptions[5];
              Cells[1,5]:=s;
            end;
          end;
        end;
      end;
    finally
      FreeMem(VerInfo,VerInfoSize);
    end;
  end;
end;

procedure TAboutBox.FormCreate(Sender: TObject);
begin
  GetVersionInfo(Application.Exename);
end;
Jetzt suche ich den Zündigen Gedanken zu meiner Idee, könnt Ihr mir da helfen? :zwinker:

himitsu 10. Nov 2009 20:48

Re: Datei von Programmversion abhängig machen
 
Mal so ganz grob überlegt:

die Datei soll von der Programmversion abhängig sein ...
also muß man wohl die Version beim Speichern mit in die Datei einbauen
und beim Auslesen der Datei mit der aktuellen Programmversion vergleichen.

:angel2:

Kunoishi 10. Nov 2009 20:56

Re: Datei von Programmversion abhängig machen
 
jups so in der Art.
deshalb wäre die Frage wie ich das Anfange.
mein Recorder zur Dat-Datei hatte ich so aufgebaut
Delphi-Quellcode:
type TArtikelerfassungRec = packed record
       Datensatz:ShortString;
       AbteilungName:ShortString;
       AbteilungNr:string[5];
       Artikel:ShortString;
       ArtikelAnzahl:longint;
       ArtikelWert:double;
       ArtikelGesamtpreis:double;
       ListeGesamt:double;
        Fremdobjekt:ShortString;
 ...
und das ganze lasse ich dann Anzeigen

procedure  CArtikelerfassung.Show(ArtikelGrid:TStringGrid);
var i:integer;
    pRec:pArtikelerfassungRec;
begin

  // Initialisierung
  SummeGesamtwert := 0;

  // Verarbeitung und Ausgabe
  if Artikel.Count = 0 then
  begin
    ArtikelGrid.RowCount := 2;
    ArtikelGrid.cells[0,1] := '-';
    ArtikelGrid.cells[1,1] := '-';
    ArtikelGrid.cells[2,1] := '-';
    ArtikelGrid.cells[3,1] := '-';
    ArtikelGrid.cells[4,1] := '-';
    ArtikelGrid.cells[5,1] := '-';
    ArtikelGrid.cells[6,1] := '-';
    ArtikelGrid.cells[7,1] := '-';
    ArtikelGrid.cells[8,1] := '-';
  end
  else
  begin
    ArtikelGrid.RowCount := Artikel.Count+1;
    for i:=0 to Artikel.Count-1 do
    begin
      pRec := Artikel.Items[i];
      ArtikelGrid.cells[0,i+1] := IntToStr(i+1);
      ArtikelGrid.cells[1,i+1] := pRec^.AbteilungName;
      ArtikelGrid.cells[2,i+1] := pRec^.AbteilungNr;
      ArtikelGrid.cells[3,i+1] := pRec^.Artikel;
      ArtikelGrid.cells[4,i+1] := FormatFloat('#,##0.00 €', pRec^.ArtikelWert);
      ArtikelGrid.cells[5,i+1] := IntToStr(pRec^.ArtikelAnzahl);

      GesamtPreis:= pRec^.ArtikelAnzahl * pRec^.ArtikelWert;

      ArtikelGrid.cells[6,i+1] := FormatFloat('#,##0.00 €', pRec^.ArtikelGesamtpreis);
      ArtikelGrid.cells[7,i+1] := pRec^.ArtikelVerbleib;
      ArtikelGrid.cells[8,i+1] := pRec^.Fremdobjekt;

      SummeGesamtwert:= SummeGesamtwert + GesamtPreis;
    end;
  end;
end;
so wie binde ich jetzt die Versionsangaben hier ein?

himitsu 10. Nov 2009 21:07

Re: Datei von Programmversion abhängig machen
 
Es kommt darauf an, wie du das ganze nun speicherst/ließt.

Im Gunde verpaßt man in soeinem Fall seiner Datei einen Header,
also einem "speziellen" Datensatz zu Begin der Datei, wo solche Informationen dann drinnen stehn.

Kunoishi 10. Nov 2009 21:11

Re: Datei von Programmversion abhängig machen
 
wie Erstelle ich so etwas???

Luckie 10. Nov 2009 21:26

Re: Datei von Programmversion abhängig machen
 
Mach einen zweiten Record mit den Versionsinformationen und schreib diesen immer als erstes einmal in die Datei.

sx2008 10. Nov 2009 21:30

Re: Datei von Programmversion abhängig machen
 
Zitat:

Zitat von Kunoishi
Ich habe eine Dat-Datei welche ich von der Versionsnummer meines Programmes abhängig machen möchte.

Dein Ziel sollte das Gegenteil sein:
Die Datei sollte unabhängig von deiner Programmversion sein.
Wenn die Daten z.B. als XML gespeichert werden, dann können jederzeit zusätzliche Elemente gespeichert werden.
Eine ältere Programmversion kennt die neuen Datenelemente nicht und ignoriert sie einfach.
Trotzdem kann auch ein altes Programm mit einer neueren Datenstruktur arbeiten.
Auch umgegekehrt gilt: eine neuere Programmversion kann auch eine alte Datenstruktur laden.
Beim Speichern werden dann die neuen Datenelemente rausgeschrieben.

Es gibt neben XML auch noch andere Datenformate mit denen man eine ähnliche Flexibilität erreicht.
(z.B. RIFF, Json,...)
Oder nimm das PNG oder TIFF-Dateiformat als Vorbild.
In diesen Dateien steckt häufig mehr Information, als die meisten Programme anzeigen;
dennoch gibt es keine Probleme weil die Daten in sog. "Chunks" verpackt sind.

Kunoishi 10. Nov 2009 21:33

Re: Datei von Programmversion abhängig machen
 
Ich glaube ich werde das mal mit dem zweiten Datenrecorder versuchen.
Da habe ich mich ja schon reingelesen.

Das mit dem XML und so wird bestimmt eine Nummer zu hoch für mich.

himitsu 10. Nov 2009 21:45

Re: Datei von Programmversion abhängig machen
 
XML ist in seinen Grundzügen garnicht so schwer, wie es vielleicht aussehn mag.
Gibt auch massenhaft Beispiele im Forum.

PS: als ich das letzte Mal mit Binärdateien gearbeitet hatte, da hab ich das Programm von der Dateiversion abhängig gemacht.
(da sich ja meist das Programm schneller entwickelt/verändert, als dessen Speicherformat)
So kann man das Programm weiterentwickeln und solange sich nichts am Dateiformat ändert, gibt es keine Probleme.
Ansonsten kann man sogar Dateiformats-abhängig mehrere Lade-Prozeduren integrieren und so auch ältere Formate noch unterstüzen.

peschai 11. Nov 2009 07:04

Re: Datei von Programmversion abhängig machen
 
Hallo

Grundsätzlich schliesse ich mich der Meinung an, daß die Daten versionsunabhäng sein sollten.

Trotzdem zu deiner Frage:
1.) Wie wäre es, wenn du die Versionsnummer in den dateiname übernimmst ?
2.) Verwende doch eine CSV-Datei (-> TCSVReader) und mache in deine Daten ein Spalte mit der Versionsnummer ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 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