Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variable an Unit von Komponente übergeben? (https://www.delphipraxis.net/100932-variable-unit-von-komponente-uebergeben.html)

Tommy1988 5. Okt 2007 16:18


Variable an Unit von Komponente übergeben?
 
Zur Info:
Ich hab mir vor kurzer Zeit eine Komponente zum Splitten und Zusammenfügen von
Dateien installiert.

Will man eine Datei zusammenfügen, so wird die zusammengefügte Datei mit der Dateiendung XXX gespeichert.

Ich habe die Dateiendung der "noch guten" Datei via Record in eine Datei gespeichert.
(OpenDialog, dann wird die zusammen mit der Datei zum "Wiedervereinen" gespeichert).
Die Dateiendung IM PROGRAMM SELBST aus der Datei auszulesen ist kein Problem.
Es sind die ersten 3 Zeichen in der Datei, die hole ich mir wie folgt:
Delphi-Quellcode:
Ex := copy(ExString, 0, 3);
Ok.
Dass die Datei mit XXX gespeichert wird, steht in einer anderen Unit (FileSplitter.pas von der Komponente)

Wie kann ich dieses Problem lösen?
Die wichtigen Zeilen in dieser Unit sind:

Delphi-Quellcode:
begin
  if FileExists(FSplitFileName) then
  begin
    { Make sure the filename is correct }
    if FFileName = '' then
      FFileName := ChangeFileExt(FSplitFileName, 'XXX'); // Hier müsste der Inhalt von "Ex" rein
Aber ich kann ja nicht 'XXX' durch Ex ersetzen. (In Ex ist die Dateiendung gespeichert).

DeddyH 5. Okt 2007 16:34

Re: Variable an Unit von Komponente übergeben?
 
Zeig mal die komplette Methode.

Tommy1988 5. Okt 2007 16:42

Re: Variable an Unit von Komponente übergeben?
 
Ok ist ziemlich lang:

Delphi-Quellcode:
{ Method UnSplit creates the original file from the split files. Name and
  extension of the original file must be set in FileName property }
procedure TFileSplitter.UnSplit;
var
  i: Integer;
  Continue: Boolean;
  sFileName: TFileName;
  BytesRead, TotalRead: LongInt;

begin
  if FileExists(FSplitFileName) then
  begin
    { Make sure the filename is correct }
    if FFileName = '' then
      FFileName := ChangeFileExt(FSplitFileName, '.XXX');

    { Delete the resulting file if it exists }
    if FileExists(FFileName) then
      EraseFile(FFileName);

    { Prepare for writing to file }
    FFile := TFileStream.Create(FFileName, fmCreate);
    GetMem(FBuffer, FBufferSize);

    try
      i := 0;
      sFileName := FSplitFileName;

      { Read files one by one and write to resulting file }
      Continue := True;
      Signature.NumberOfFiles := 0;
      while Continue do
      begin
        if Assigned(FOnNeedDisk) then
          FOnNeedDisk(Self, i + 1, Signature.NumberOfFiles, Continue);

        if Continue then
        begin
          if FileExists(sFileName) then
          begin
            try
              FSplitFile := TFileStream.Create(sFileName, fmOpenRead);

              { Read the signature from the first split file }
              if i = 0 then
                FSplitFile.Read(Signature, SizeOf(Signature));

              TotalRead := 0;
              while FSplitFile.Size <> FSplitFile.Position do
              begin
                BytesRead := FSplitFile.Read(FBuffer^, FBufferSize);
                FFile.Write(FBuffer^, BytesRead);
                TotalRead := TotalRead + BytesRead;

                { Call OnProgress event }
                if Assigned(FOnProgress) then
                  FOnProgress(Self, (TotalRead * 100)
                  div FSplitFile.Size);
              end;
            finally
              FSplitFile.Free;
            end;
            Inc(i);
            sFileName := ChangeFileExt(sFileName, '.' +
             StrZero(i, 3));
          end
          else
            Continue := False;
        end;
      end;
    finally
      FreeMem(FBuffer);
      FFile.Free;
    end;
  end
  else
    raise EFileError.Create('Input file '''
    + FSplitFileName + ''' does not exist.');
end;

DeddyH 5. Okt 2007 16:47

Re: Variable an Unit von Komponente übergeben?
 
IMHO sollte es so ohne großen Aufwand gehen:
Delphi-Quellcode:
procedure TFileSplitter.UnSplit(sExtension: string = '.XXX');
var
  i: Integer;
  Continue: Boolean;
  sFileName: TFileName;
  BytesRead, TotalRead: LongInt;

begin
  if FileExists(FSplitFileName) then
  begin
    { Make sure the filename is correct }
    if FFileName = '' then
      FFileName := ChangeFileExt(FSplitFileName, sExtension);
...
Wenn keine Extension explizit angegeben wird, bleibt alles beim Alten, ansonsten kannst Du eine angeben, die dann verwendet wird.

Tommy1988 5. Okt 2007 17:12

Re: Variable an Unit von Komponente übergeben?
 
Delphi-Quellcode:
(sExtension: string = '.XXX');
Das Problem bei der ganzen Sache ist ja, dass ich keine Variable von meinem Projekt in diese Unit einbinden kann :) So wäre es ja immernoch quasi Unit-bezogen

DeddyH 5. Okt 2007 17:15

Re: Variable an Unit von Komponente übergeben?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Erstelle Dir doch eine Property innerhalb der Kompo als Schnittstelle zu Deinem Programm.

[edit] OK, habe ich mal erledigt, aber nicht getestet (hatte keine Lust, die Kompo zu installieren). Du solltest eine neue Property CustomExt entdecken, welche die Extension aufnimmt.[/edit]

Tommy1988 5. Okt 2007 18:22

Re: Variable an Unit von Komponente übergeben?
 
Ich weis nicht, ich glaube ihr versteht mich nicht :cry:

Jetzt heißt da ja eine Zeile:
Delphi-Quellcode:
  FCustomExt := '.XXX';
Aber XXX ist immernoch da.
Also ich mein, mein Inhalt aus der Variablen sollte ja da rein, aber ich bekomme es auch nicht hin.

DeddyH 5. Okt 2007 18:36

Re: Variable an Unit von Komponente übergeben?
 
Ich glaube eher, Du verstehst mich nicht. Bevor Du die Komponente an die Arbeit schickst, weist Du ihr Deine Variable als gewünschte Extension zu.
Delphi-Quellcode:
FileSplitter.CustomExt := DeineVariable;
[edit] Mal ein bisschen ausführlicher zum Mitschreiben:
Delphi-Quellcode:
var bla: string;
begin
  bla := '.bla';
  FileSplitter.CustomExt := bla;
  FileSplitter.UnSplit;
end;
[/edit]

Tommy1988 5. Okt 2007 19:33

Re: Variable an Unit von Komponente übergeben?
 
Delphi-Quellcode:
{ Component constructor... }
constructor TFileSplitter.Create(AOwner: TComponent);
begin
  inherited;
  FFileName := '';
  FCustomExt := 'XXX';
  FSplitFileName := FFileName;
  FOutDifferent := False;
  FSize := 1457664;
  FBufferSize := 1457664;
  FReduceFirstSizeBy := 0;
  Signature.Copyright := 'Copyright';
  Signature.NumberOfFiles := 0;
end;
Nein, klappt kmischerweise immernoch nicht. Die Variable ist seltsamerweise immer leer

DeddyH 5. Okt 2007 19:36

Re: Variable an Unit von Komponente übergeben?
 
Moment, hast Du die Originaldatei überschrieben und das Package neu kompiliert? Dann solltest Du die neue Property im OI sehen können mit dem Initialwert '.XXX'

Tommy1988 5. Okt 2007 19:43

Re: Variable an Unit von Komponente übergeben?
 
1. Neu kompiliert.

Dann habe ich im typebereich bei Copyright noch Exename hinzugefügt (String)
und unten "Signature.ExeName := FCustomExt;" eingefügt. Jetzt klappt es.
Aber nicht mehr so wie ich das mit dem "Copy" hatte :?

Weil ich hatte ja die Dateiendung der zu splittenden Datei in dieser gesplitteten Datei ganz am anfang gespeichert und dann mit Copy ausgelesen.

Muss ich mir mal angucken

DeddyH 5. Okt 2007 19:47

Re: Variable an Unit von Komponente übergeben?
 
Oh Mann :wall: , habe mir den Source einmal genauer angesehen und festgestellt, dass die Dateiendung eh nur dann auf XXX gesetzt wurde, wenn die Property FileName leer war. Hätte man sich also auch sparen können, aber naja.

Tommy1988 5. Okt 2007 19:53

Re: Variable an Unit von Komponente übergeben?
 
Das hab ich im vorhinein schon geklört gehabt.

Mein Problem ist jetzt nur, dass das verdammte CustomExt nicht in die Datei schreiben will

Oben hab ich ExeName jezt als array [1..34] of Char; hingeschrieben

unten.. ja da kann ich nix hinschreiben weil
Signature.ExeName := CustomExt;
nicht geht

DeddyH 5. Okt 2007 19:55

Re: Variable an Unit von Komponente übergeben?
 
CustomExt heißt doch nur, dass Du dort die Dateiendung angeben kannst, die Dir beliebt, nicht mehr und nicht weniger.

Tommy1988 5. Okt 2007 19:57

Re: Variable an Unit von Komponente übergeben?
 
Ich meinte eigentlich, das hier:: mom..

Wenn ich eine Datei splitte, dann wird
TFileSplitter.Create
aufgerufen. Und da dachte ich, dass ich die Dateiendug zu gesplitteten Datei darin speichere damit die in die Datei geschrieben wird.

und wenn ich dann später unsplitte hole ich mir die ersten 3 zeichen via copy und setze daraus Dateiname + Dateiendung zusammen

DeddyH 5. Okt 2007 20:04

Re: Variable an Unit von Komponente übergeben?
 
Nein, falsch verstanden, so arbeitet die Kompo nicht. Ist da keine Demo dabei? Hab wirklich nur flüchtig drübergeschaut.

Tommy1988 5. Okt 2007 20:10

Re: Variable an Unit von Komponente übergeben?
 
Doch, die demo nehme ich als grundlage ich habe es mir soweit ich konnte umgeschrieben.

Weil was bringt es mir eine datei zu splitten, wenn sie, wenn ich sie unsplitte, die dateiendung XXX hat.

Deswegen wollte ich die dateiendung abschneiden, in die dateischreiben (in die dateischreiben klappt), dann beim unsplitten auslesen und an die datei hängen.

So lese ich es aus:
Delphi-Quellcode:
FileName := OpenDialog.FileName;

  AssignFile(Datei, FileName);
  Reset(Datei);
  try
    ReadLn(Datei, MyString);
    Label4.Caption := copy(MyString, 0, 3);
    Ex := copy(MyString, 0, 3);
    FileSplitter.CustomExt := Ex;
  finally
    CloseFile(Datei);
  end;
  bla := Ex;
  FileSplitter.CustomExt := bla;
  FileSplitter.UnSplit;
  ShowMessage('Done unsplitting!');
end;
Nur da gibts ein problem in der unit filesplitter

Delphi-Quellcode:
type
  TSignature = record
    ExeName: String; // String, weil mit Array ist unkompatibel
    Copyright: array [1..34] of Char;
    NumberOfFiles: Word;
  end;
Delphi-Quellcode:
 
// ..
Signature.ExeName := CustomExt; // Problem !!!, es wird "nix" hineingeschrieben, also leer
  Signature.Copyright := 'Copyright';
  Signature.NumberOfFiles := 0;

DeddyH 5. Okt 2007 20:13

Re: Variable an Unit von Komponente übergeben?
 
Mal langsam zum Verständnis: Du möchtest in dem Record den Originalnamen der Datei ablegen und diese später unter diesem Namen wiederherstellen?

Tommy1988 5. Okt 2007 20:15

Re: Variable an Unit von Komponente übergeben?
 
Ja, so kann man es auch sagen.

Nur ich kriegs nicht richtig hin :?
Ist das falsch mit dem Record? oder überhaupt wie ich das mache

DeddyH 5. Okt 2007 20:29

Re: Variable an Unit von Komponente übergeben?
 
Moment, ich muss noch mal in die Sourcen schauen (diesmal etwas genauer).

DeddyH 5. Okt 2007 20:38

Re: Variable an Unit von Komponente übergeben?
 
Tust Du mir bitte einen Gefallen und änderst alle "continue" in z.B. "bContinue"?

DeddyH 5. Okt 2007 20:42

Re: Variable an Unit von Komponente übergeben?
 
Also, das wird so nicht gehen, da er die Datei öffnen muss, um die Signatur auszulesen. Du müsstest die Kompo so umschreiben, dass nach dem Auslesen dieser Signatur der FileStream geschlossen und wieder neu mit dem ausgelesenen Dateinamen (der übrigens eine feste Länge haben muss) erzeugt wird.

Tommy1988 5. Okt 2007 20:47

Re: Variable an Unit von Komponente übergeben?
 
Mhhh... ich Probier grade mal etwas aus undzwar das hier:
Beim splitten hole ich mir den Dateinamen und speichere den in einer Variablen.
Dann gebe ich den weiter an die Kompo und die Kompo schreibt den Namen mit in die Datei.

So, das Probier ich jetzt einfach mal


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz