Thema: Delphi Seltsame AV

Einzelnen Beitrag anzeigen

Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

Seltsame AV

  Alt 28. Okt 2017, 12:38
Delphi-Version: XE8
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]) = '.NEFthen
        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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat