Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Seltsame AV (https://www.delphipraxis.net/194207-seltsame-av.html)

Delbor 28. Okt 2017 11:38

Delphi-Version: XE8

Seltsame AV
 
Hi zusammen

Ich habe mir einen eigenen "FileDlg" gebastelt - wenn der fündig wird, feuert er ein Event ab , dem er eine Stringvariable mit dem Ordnernamen und eine Liste mit den in diesem Ordner vorhandenen (Bild-)Dateien mitgibt.
Der Eventhandler dazu:
Delphi-Quellcode:
procedure TFDSQLiteDML.DoPathlistEvent(Sender: TObject; const Ordner: String;
  const Pathlist: TStringlist);
  var Bildpfad, LPath : String; ID_GUID: TGUID; LPathCount : integer;
begin
  LPathCount := Pathlist.Count;//*
  CM_First.CreateProgressbarDlg(LPathCount);
  try
    CM_First.ProgressbarDlg.Top := (Screen.Height - (CM_First.ProgressbarDlg.Height + 10));
    CM_First.ProgressbarDlg.Left := (Screen.Width - CM_First.ProgressbarDlg.Width) div 2;
    Application.ProcessMessages;
    CM_First.Listbox1.Items.AddStrings(Pathlist);                  
    Bildpfad := PathList[0];                                        
    LPath := ExtractFilePath(Bildpfad)+'IdentFile.cgf';
    if not FileExists(LPath+'IdentFile.cgf') then
    begin
      ID_GUID := CreateIDFile(LPath);
      ShowMessage(Id_GUID.toString);
    end;
    try
      FDSQLiteDML.FDSQLiteConnection.StartTransaction;
      BildTabelleInsert2(100, ID_GUID,Pathlist);                     //<=== Startet die Insert-Prozeduren
      Self.FDSQLiteConnection.Commit;
    except
      Self.FDSQLiteConnection.Rollback;
    end;
  finally
      CM_First.ProgressbarDlg.FormStyle := fsnormal;
      CM_First.ProgressbarDlg.Close;
      FreeAndNil(CM_First.ProgressbarDlg);
//      if assigned(FolderID) then
//        FolderID.Free;
  end;
end;
In der auskommentierten Zeile wird die erste eimer Reihe von Insert-Prozeduren mit 3 Parametern aufgerufen. Einer davon ist Pathlist, die Liste mit den vom Event erhaltenen Pfaden.

Delphi-Quellcode:
procedure TFDSQLiteDML.BildTabelleInsert2(Seitenlaenge: Integer; ID_GUID : TGUID; Pathlist : TStringlist);
  var BMap, WorkMap: TBitmap; BJpeg: TJPEGImage; LPicture : TPicture; Bildname, Bildpfad, LIdFolder: string;
      startTime, CInserttime: Cardinal; BildTabelleLastId, i,inserted : Integer;     // ,IDBild
begin
  LPicture := TPicture.Create;
  BMap := TBitmap.Create;
  WorkMap := TBitmap.Create;      
  BJpeg := TJpegImage.Create;
  BJpeg.CompressionQuality := 100;
  BJpeg.PixelFormat := jf24Bit;
 try
    FTotal := PathList.Count; // <<======================= AV
    for i := 0 to PathList.Count - 1 do              
    begin                                            
//      if i = 0 then
//        startTime := GetTickCount;
//      FRest := FPathList.Count - i;
//      if FDQueryMain.Active then
//        FDQueryMain.Active := False;
      Bildname := ExtractFileName(FPathList[i]);      
      Bildpfad := FPathList[i];
      Delete(BildName,Length(BildName)-3,4);          
        if ExtractFileExt(FPathList[i]) = '.NEF' then  
        begin                                          
          LPicture.LoadFromFile(PathList[i]);
          BMap.Assign(LPicture.Graphic);
          WorkMap.Assign(LPicture.Graphic);
          FModifyBitmap.ScaleBitmaps(BMap, Seitenlaenge);
          BJpeg.Assign(BMap);
          LIdFolder := ID_GUID.ToString;
          BildTabelleLastId := BildInsertQuery(BJpeg,WorkMap,LIdFolder);     //Ab hier werden nacheinander die Insert-Prozeduren
          BildDescribeTabelleInsert(BildTabelleLastId,BildName,Bildpfad);    //aufgerufen
....
An der bezeichneten Stelle erhalte ich die AV, obwohl FTotal korrekt als privates integerfeld deklariert und Pathlist offenbar korrekt gefüllt ist - Pathlist.Count hat den Wert 44.
Zu //* : Diese Zuwweisung macht keine Probleme.

Ich sehe auch keinen Grund, wieso eine Methode eine per Event erhaltene Stringliste nicht weiterreichen könnte. Oder irre ich mich da?

Gruss
Delbor

Uwe Raabe 28. Okt 2017 12:23

AW: Seltsame AV
 
Du verwendest mal
Delphi-Quellcode:
PathList
, mal
Delphi-Quellcode:
FPathList
. Sieht anhand des gezeigten irgendwie nicht richtig aus.

Delbor 28. Okt 2017 12:29

AW: Seltsame AV
 
Hi zusammen

Das "Mysterium" hat sich aufgelöst. Zur Erinnerung: In der ersten gezeigten Prozedur habe ich eine Zuweisung:
Delphi-Quellcode:
LPathCount := Pathlist.Count;
Dabei steht das 'L' für lokale Variable. Ich hab das testeise mal ersetzt durch:
Delphi-Quellcode:
FPathCount := Pathlist.Count;
Also 'F' für private Felder. Und das hat mir Delphi dann um die Ohren gehauen...

Gruss
Delbor

Delbor 28. Okt 2017 12:41

AW: Seltsame AV
 
Hi Uwe Raabe
Zitat:

Du verwendest mal PathList , mal FPathList . Sieht anhand des gezeigten irgendwie nicht richtig aus.
Stimmt - ich hoffe, ich habe diese FPathlist nun endgültig raus.

Früher hatte ich in jeer Unit eine Liste angelegt, in der ich eine brauchte- Dann wurde mir (Dank dieses Forums ) klar, dass auch durch übergebene Listen iteriert werden kann. Oder besser gesagt: die übergebene Liste wird nicht 'arbeitslos', bzw. freigegeben, nur weil ich deren Strings an eine andere Liste übergeben habe, sondern erst, nachdem der Event und die darin aufgeufenen Prozeduren abgearbeitet und der Event zurückgekehrt ist.

Von daher also noch dieses FPathlist, so Quasi als Überbleibsel der Feldvariablen. Aber wie gesagt - die ist, zumindest in dieser Unit, jetzt raus.

Gruss
Delbor


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