Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
Внизпроверка готовности диска А и копирование на дискету Найти похожие ветки
← →
Sw (2009-09-01 09:18) [0]
function IsDriveReady(const Drive: char): Boolean;
var
DrvNum: byte;
EMode: Word;
begin
result := true;
DrvNum := ord(Drive);
if DrvNum >= ord("a") then
dec(DrvNum, $20);
EMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
while DiskSize(DrvNum - $40) = -1 do
begin
case (Application.MessageBox("Диск не готов..." + chr(13) + chr(10) +
"Повторить?", PChar("Диск " + UpperCase(Drive)), mb_OKCANCEL +
mb_iconexclamation {IconQuestion})) of
IDOK:IsDriveReady(Drive);
IDCANCEL: begin Result := false; Break; end;
end;
end;
finally
SetErrorMode(EMode);
end;
end;
//процедура копирования файлов//
function WindowsCopyFile(FromFile, ToDir : string) : boolean;
var
F: TShFileOpStruct;
begin
F.Wnd := 0; F.wFunc := FO_COPY;
FromFile:=FromFile+#0; F.pFrom:=pchar(FromFile);
ToDir:=ToDir+#0; F.pTo:=pchar(ToDir);
F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
result:=ShFileOperation(F) = 0;
end;
.....................................................
if IsDriveReady(device) then
if WindowsCopyFile(sFileName,export_folder) then
Application.MessageBox("Данные выгружены успешно", "Окно сообщений", MB_ICONINFORMATION);
.....................................................
Помогите, пожалуйста, разобаться. Если дискета установлена, то все правильно отрабатывает. А если диск не обнаружен ("Диск не готов..." + "Повторить?",) -> вставляем дискету и нажимаем Повторить....выдает сообщение: "Данные выгружены успешно" , но ничего на дискету не выгружает.
← →
Virgo_Style © (2009-09-01 10:56) [1]
> FromFile:=FromFile+#0
Тебе хорошо, у тебя копирование, а когда я при удалении второй нолик добавить забыл - ой что былоооо...
← →
clickmaker © (2009-09-01 11:45) [2]> ой что былоооо
а что было? диск почистился? )
← →
Anatoly Podgoretsky © (2009-09-01 11:57) [3]> clickmaker (01.09.2009 11:45:02) [2]
У меня однажды Виндоус деинсталировался :-)
← →
Sw (2009-09-01 12:03) [4]
> Virgo_Style
слава Богу, у меня копирование.:(...сожалею Вам
а где у меня ошибка?
← →
Sw (2009-09-01 12:04) [5]ужасы какие
← →
KilkennyCat © (2009-09-01 12:05) [6]
> а где у меня ошибка?
В отсутствии внимательности. Вдумчиво читаем про нолики.
← →
Sw (2009-09-01 12:43) [7]http://www.delphimaster.ru/articles/advice/top.html
(Копирование методами Windows)
ну не дошло про нолики.....внимательно смотрю..по второму нулю не вижу ..разъясните пожалуйста, будьте добры
← →
clickmaker © (2009-09-01 12:56) [8]> разъясните пожалуйста, будьте добры
при копировании нескольких файлов, их имена разделяются нулем. А чтобы обозначить конец списка, добавляется еще один ноль
← →
Student © (2009-09-01 12:56) [9]FromFile:=FromFile+#0
я на дискетку всегда вот так писал, может поможет
FileName := FileName + "0";
← →
Anatoly Podgoretsky © (2009-09-01 12:57) [10]Есть
FromFile+#0
F1 по типу string
← →
Sw (2009-09-01 13:24) [11]а разве у меня не так? в функции WindowsCopyFile именно так и написано:
FromFile:=FromFile+#0;
и копирую я на дискету один файл (правда, это zip-архив и содержит он три файла).
И почему тогда, если дискета установлена, то все копируется и все красиво.
А если нет дискетки, делаем "Повторить"....и не копирует.
← →
clickmaker © (2009-09-01 13:26) [12]а зачем рекурсивный вызов IsDriveReady, если там и так цикл?
← →
clickmaker © (2009-09-01 13:27) [13]не говоря уже о том, что результат здесь игнорируется
IDOK:IsDriveReady(Drive);
← →
Sw (2009-09-01 13:30) [14]и убрав эту строку ...то же самое получаю
← →
clickmaker © (2009-09-01 13:46) [15]> то же самое получаю
что-то не верится...
вот так все должно работать
function IsDriveReady(const Drive: char): Boolean;
var
DrvNum: byte;
EMode: Word;
begin
result := true;
DrvNum := ord(Drive);
if DrvNum >= ord("a") then
dec(DrvNum, $20);
dec(DrvNum, $40);
EMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
while DiskSize(DrvNum) = -1 do
begin
if Application.MessageBox(PChar("Диск не готов..."#13#10"Повторить?"),
PChar("Диск " + UpperCase(Drive)), mb_OKCANCEL +
mb_iconexclamation) = IDCANCEL then begin
Result := false;
Break;
end;
end;
finally
SetErrorMode(EMode);
end;
end;
← →
Sw (2009-09-01 14:03) [16]полностью заменяю на ваш код......если дискета стоит....отрабатывает как положено.....тока уберу ...выдает Повторить? вставляю дискету, ентер ...пишет, что скопировал....а на самом деле нету ничего на дискете
← →
clickmaker © (2009-09-01 14:11) [17]ну хорошо...
как выглядят sFileName и export_folder в данном случае?
← →
Sw (2009-09-01 14:27) [18]
//преобразование длинного пути в короткий//
function LongPathToShort(path:string):string;
var buffer:string; len:integer;
begin
SetLength(buffer, MAX_PATH);
len:=GetShortPathName(PAnsiChar(path), PAnsiChar(buffer), MAX_PATH);
SetLength(buffer, len);
LongPathToShort:=buffer;
end;
var export_folder_default:string;
export_folder:string;
sdt:TDate;
fdt:string;
AppIni: TIniFile;
//sFileName****************************************************
export_folder_default:=LongPathToShort(ExtractFilePath(Application.ExeName)+"\sod\");
sdt:=Date;
DateTimeToString(fdt,"mmdd",sdt);
sFileName:=export_folder_default + "4777"+fdt+".zip";
//export_folder *************************************************
AppIni := TIniFile.Create(ExtractFilePath(Application.ExeName)+"sod.ini");
device:=AppIni.ReadString("Export", "Export_folder","")[1];
export_folder:=LongPathToShort(AppIni.ReadString("Export", "Export_folder",""));
AppIni.Free;
← →
clickmaker © (2009-09-01 14:32) [19]то есть на момент копирования в sFileName,export_folder находятся полные пути к файлу и целевой папке? и это видно в отладчике?
← →
Sw (2009-09-01 14:53) [20]в sFileName полный путь к файлу
в export_folder - A:\
это у меня dll-ка....ссори...не знаю как смотреть в отладчике....
сейчас заметила, что после замены на ваш код (IsDriveReady) файлик создается в каталоге с EXE-ком проги (это когда после "Повторить?")
← →
Sw (2009-09-01 14:59) [21]и если на момент копирования в export_folder полный путь к файлу ...ничего не меняется
← →
clickmaker © (2009-09-01 14:59) [22]> файлик создается в каталоге с EXE-ком проги
значит функция копирует его в текущий каталог. То есть папка-назначение все-таки неправильно указана.
Видимо, когда это работало, текущим был диск А
← →
Sw (2009-09-02 06:19) [23]Спасибо огромное за помощь, действительно, проблема с папкой-назначение.
export_folder:=LongPathToShort(AppIni.ReadString("Export", "Export_folder",""));
в случае отсутствия дискеты export_folder не определено
я так понимаю, это происходит, т.к. для LongPathToShort необходимо, чтобы путь существовал.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.044 c