Форум: "Основная";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
ВнизVBA: For each CollectionItem in Collection. Delphi: ? Найти похожие ветки
← →
RomanB (2003-10-07 16:45) [0]
Sub ShowDriveList
Dim fs, d, dc, s, n
Set fs = CreateObject("Scripting.FileSystemObject")
Set dc = fs.Drives
For Each d in dc
s = s & d.DriveLetter & " - "
If d.DriveType = 3 Then
n = d.ShareName
Else
n = d.VolumeName
End If
s = s & n & vbCrLf
Next
MsgBox s
End Sub
Нашел этот пример в Visual Basic for MS Office 2000. Так вот, не могу перенести в Delphi цикл For Each ...?
← →
Palladin (2003-10-07 16:50) [1]в цикле for по всем элементам коллекции...
← →
RomanB (2003-10-08 16:06) [2]Сам-то пробовал??????????????????
procedure TForm1.Button1Click(Sender: TObject);
var
fs, d, dc: Variant;
s, n: String;
i: Integer;
begin
fs:=CreateOleObject("Scripting.FileSystemObject");
dc:=fs.Drives;
s:="";
for i:=0 to dc.Count-1 do
begin
d:=dc.Item[i]; //ОШИБКА --- см. ниже
s:=s+d.DriveLetter+" - ";
if d.DriveType=3 then
n:=d.ShareName
else
n:=d.VolumeName;
s:=s+n+chr(13);
end;
ShowMessage(s);
fs:=Unassigned;
dc:=Unassigned;
d:=Unassigned;
end;
ОШИБКА: "Project Project1.exe raised exception class EOleException with message "Параметр задан неверно"."
← →
Palladin (2003-10-08 19:42) [3]
> Сам-то пробовал??????????????????
не нервничай
procedure TForm1.Button1Click(Sender: TObject);
var
fs, d: Variant;
s: String;
s1:WideString;
i: Integer;
begin
fs:=CreateOleObject("Scripting.FileSystemObject");
s:="";
for i:=0 to 24 do
begin
s1:=chr(i+65)+":\";
try
d:=fs.GetDrive(s1);
s:=s+d.DriveLetter+" - ";
if d.DriveType=3 then s:=s+d.ShareName
else s:=s+d.VolumeName;
s:=s+#13#10;
except
end;
end;
ShowMessage(s);
fs:=Unassigned;
d:=Unassigned;
end;
← →
Ломброзо Цезарь (2003-10-08 20:16) [4]В грёбаном бейсике коллекции нумеруются с единицы, а не с нуля, и до Count, а не Count - 1
← →
Palladin (2003-10-08 20:25) [5]
> Ломброзо Цезарь © (08.10.03 20:16) [4]
да и это тоже...
в случае с Scripting.FileSystemObject.Drives, в Items принимает строку пути... вобщем чтонибудь откуда можно взять имя диска...
ну оно и понятно, все основывается на GetLogicalDriveStrings...
← →
RomanB (2003-10-09 16:46) [6]>Palladin
GetDrive() - это не выход!!!
В Drive есть еще Folders, SubFolders и Files --- их как как перебирать, Ааааа!
>Ломброзо Цезарь
А, в чем связь между Scripting.FileSystemObject и Бейсиком??? Это же не внутренний, а внешний объект для Бейсика!!! Просто в Help`е Бейсика все очень толково описано про Scripting.FileSystemObject и его подобъекты! Но там все через цикл For Each ...! Вот и чешу тыкву!
← →
Palladin (2003-10-10 00:07) [7]Выход не выход, решать тебе конечно...
для Files есть GetFile, для Folders есть GetFolder
в статье Тенцера про ScriptControl про for each сказано следующее
"Реализация For Each предусматривает следующее:
Исполняющее ядро ScriptControl вызывает метод Invoke объекта, по элементам которого должен производиться цикл с DispID = DISPID_NEWENUM (-4).
Объект должен вернуть интерфейс IenumVariant.
Далее ядро использует методы IEnumVariant для получения элементов коллекции. "
Ищи, ковыряй, чеши свою тыкву.
← →
Ломброзо Цезарь (2003-10-10 02:19) [8]Слушай, тебе _непременно_ надо с FSO через Delphi работать? Если в MS сделали индексирование коллекций через ж..., и причем так, что даже ITypeInfo хрен получишь, то у них на то свои соображения - что-то прячут, видать. Выходов несколько
1) FindFirst/FindNext
2) Прикрутить Microsoft Script Control и внедрить код на VB в свою программу
3) Работать через SHGetDesktopFolder, IShellFolder и т.п. (см. статью Акжана Абдулина здесь или на Королевстве)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c