AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Datei von Programmversion abhängig machen
Thema durchsuchen
Ansicht
Themen-Optionen

Datei von Programmversion abhängig machen

Ein Thema von Kunoishi · begonnen am 10. Nov 2009 · letzter Beitrag vom 11. Nov 2009
Antwort Antwort
Kunoishi

Registriert seit: 26. Dez 2002
Ort: Berlin
140 Beiträge
 
Delphi 5 Standard
 
#1

Datei von Programmversion abhängig machen

  Alt 10. Nov 2009, 21:44
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

Re: Datei von Programmversion abhängig machen

  Alt 10. Nov 2009, 21:48
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.

$2B or not $2B
  Mit Zitat antworten Zitat
Kunoishi

Registriert seit: 26. Dez 2002
Ort: Berlin
140 Beiträge
 
Delphi 5 Standard
 
#3

Re: Datei von Programmversion abhängig machen

  Alt 10. Nov 2009, 21:56
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: Datei von Programmversion abhängig machen

  Alt 10. Nov 2009, 22:07
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Kunoishi

Registriert seit: 26. Dez 2002
Ort: Berlin
140 Beiträge
 
Delphi 5 Standard
 
#5

Re: Datei von Programmversion abhängig machen

  Alt 10. Nov 2009, 22:11
wie Erstelle ich so etwas???
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Datei von Programmversion abhängig machen

  Alt 10. Nov 2009, 22:26
Mach einen zweiten Record mit den Versionsinformationen und schreib diesen immer als erstes einmal in die Datei.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Datei von Programmversion abhängig machen

  Alt 10. Nov 2009, 22:30
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.
fork me on Github
  Mit Zitat antworten Zitat
Kunoishi

Registriert seit: 26. Dez 2002
Ort: Berlin
140 Beiträge
 
Delphi 5 Standard
 
#8

Re: Datei von Programmversion abhängig machen

  Alt 10. Nov 2009, 22:33
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

Re: Datei von Programmversion abhängig machen

  Alt 10. Nov 2009, 22:45
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#10

Re: Datei von Programmversion abhängig machen

  Alt 11. Nov 2009, 08:04
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 ?
Peter Schaible
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:28 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