Das Programm ist auf einem WinX-Rechner entwickelt und arbeitet dort. Dabei geht es speziell um eine Routine, die alle selektierten Files eines VirtualTreeViews (z.B.von der Festplatte) auf eine Backup-Platte speichern und gegebenenfalls dort dieselben Verzeichnisse erzeugen soll. Vor dem Kopieren zeige ich einen ProgressDialog, der die gerade kopierten files anzeigt und mit dem man den Vorgang gegebenenfalls abbrechen kann.
Code: Alles auswählen
// disable buttons
changeBedienung(false);
// show the progress dialog
FGlobalCancel := false;
ProgressDialog.SetzFunktion('Kopieren von');
ProgressDialog.progCallBack := @SetGlobalCancel;
ProgressDialog.Show;
try
// get first selected node
lnksNode := trv_Links.GetFirstSelected(true);
try
while (lnksNode <> nil) AND NOT(FGlobalCancel)
do begin
// get the pointer to its data
lnksData := trv_Links.GetNodeData(lnksNode);
// get complete source path
wholeLeft := lnksData^.FddAllPath;
// we need the relative path too
// attention: relPath does begin with slash!!!
relLeft := optclass.getRelativePfad(wholeLeft, optclass.aktLinks);
// get the root path of the destination
wholeRght := optclass.aktRechts;
// and same relative path
wholeRght := wholeRght + relLeft;
ProgressDialog.SetzQuelle(wholeLeft);
Application.ProcessMessages;
// create the dir if not exist and copy the selected file
copyFileWithDir(wholeLeft, wholeRght);
// get next selected node
lnksNode := trv_Links.GetNextSelected(lnksNode);
end; {while}
except
on e: Exception do
begin
{$IFDEF MSWINDOWS}
FehlerDialog.SetzFehler(e.Message);
FehlerDialog.ShowModal;
{$ELSE}
MessageDlg(optclass.ProgTitel, e.Message, mtError, [mbOK], 0);
{$ENDIF}
end;
end;
Lasse ich das Ganze mit BreakPoints laufen, tappert er wirklich alle Files ab und kopiert sie auch.
Schalte ich das Pärchen ProgressDialog.SetzQuelle und Application.ProcessMessages ab, dann funktioniert ebenfalls alles, wie es soll beim normalen Lauf.
Vielleicht ist es irgendein Timing-Problem durch anderes Verhalten von ProcessMessages unter Linux?
Ich muss dazu sagen, dass Linux anscheinend generell einige Probleme mit meinen eigenen Dialogen zu haben scheint, besonders mit modalen. Da kommt gern die Meldung, dass er die nicht anzeigen könne, weil sie schon sichtbar seien -- und dann passieren auch unmögliche Dinge. Deshalb habe ich diese Dialoge durch {IFDEF ...} ausgeklammert und in Linux durch StandardDialogs ersetzt, wie unten gezeigt.
Aber vielleicht hat ja der eine oder andere eine Idee, was da sonst schief laufen könnte. Ich bin jedenfalls erstmal ratlos und für jeden Tipp dankbar.
Gruß
antoine