Dim strFileName As String
strFileName = Command
открытие ткстовых документов своей прогой.
подскажите как открывать своей программой, которую ты сделал сам, текстовые документы, из контекстного меню explorera : открыть с помощью\моя программа. когда я пытаюсь так открыть, то у меня в моём текстовом редакторе пусто. помогите. а? заранее спасибо:)
Код:
-----------------
Передать имя файла (файлов) в качестве аргументов командной строки. В коде получить их из функции Command$
s = Command$
Потом проверять строку: там может быть мусор, может быть неправильный тип файлов, несколько имен файлов, в общем - что угодно. И главное имена файлов с пробелами заключаются в кавычки, а без пробелов - остаются так. Однако при выполнении Open With имя файла (там только одно передается сколько бы не было выбрано) всегда в кавычках. В общем, я как-то написал функцию, подозреваю что это полное убоище, но она работает четко и делает что нужно - преобразует входящую кашу в список имен файлов разделенных 0 (или чем хотите).
Код:
Private Function checkCommand(s As String) As String
Dim sd As String
Dim i As Long
Dim char As String
Dim res As String
Dim b As Boolean
sd = vbNullChar
For i = 1 To Len(s)
char = Mid(s, i, 1)
If char <> Chr(34) Then
res = res & IIf((char = " "), sd, char)
Else
b = Not b ' even/odd trigger
sd = IIf(b, " ", vbNullChar)
End If
Next i
checkCommand = res
End Function
Dim sd As String
Dim i As Long
Dim char As String
Dim res As String
Dim b As Boolean
sd = vbNullChar
For i = 1 To Len(s)
char = Mid(s, i, 1)
If char <> Chr(34) Then
res = res & IIf((char = " "), sd, char)
Else
b = Not b ' even/odd trigger
sd = IIf(b, " ", vbNullChar)
End If
Next i
checkCommand = res
End Function
Пример использования
Код:
dim s as string
dim p() as string
'....
s = Command$
If Len(s) Then
p = Split(checkCommand(s), vbNullChar)
If UBound(p) > 0 Then
MsgBox "U have selected more than one file. Abort.", vbCritical
Else
s = p(0)
If fso.GetExtensionName(s) = "ai" Then
' ... some code ...
End
End If
End If
End If
dim p() as string
'....
s = Command$
If Len(s) Then
p = Split(checkCommand(s), vbNullChar)
If UBound(p) > 0 Then
MsgBox "U have selected more than one file. Abort.", vbCritical
Else
s = p(0)
If fso.GetExtensionName(s) = "ai" Then
' ... some code ...
End
End If
End If
End If
Код:
Function GetCommandLine(Optional MaxArgs)
'Declare variables.
Dim C, CmdLine, CmdLnLen, InArg, I, NumArgs
'See if MaxArgs was provided.
If IsMissing(MaxArgs) Then MaxArgs = 10
'Make array of the correct size.
ReDim ArgArray(MaxArgs)
NumArgs = 0: InArg = False
'Get command line arguments.
CmdLine = Command()
CmdLnLen = Len(CmdLine)
'Go thru command line one character
'at a time.
For I = 1 To CmdLnLen
C = Mid(CmdLine, I, 1)
'Test for space or tab.
If (C <> " " And C <> vbTab) Then
'Neither space nor tab.
'Test if already in argument.
If Not InArg Then
'New argument begins.
'Test for too many arguments.
If NumArgs = MaxArgs Then Exit For
NumArgs = NumArgs + 1
InArg = True
End If
'Concatenate character to current argument.
ArgArray(NumArgs) = ArgArray(NumArgs) & C
Else
'Found a space or tab.
'Set InArg flag to False.
InArg = False
End If
Next I
'Resize array just enough to hold arguments.
ReDim Preserve ArgArray(NumArgs)
'Return Array in Function name.
GetCommandLine = ArgArray()
End Function
'Declare variables.
Dim C, CmdLine, CmdLnLen, InArg, I, NumArgs
'See if MaxArgs was provided.
If IsMissing(MaxArgs) Then MaxArgs = 10
'Make array of the correct size.
ReDim ArgArray(MaxArgs)
NumArgs = 0: InArg = False
'Get command line arguments.
CmdLine = Command()
CmdLnLen = Len(CmdLine)
'Go thru command line one character
'at a time.
For I = 1 To CmdLnLen
C = Mid(CmdLine, I, 1)
'Test for space or tab.
If (C <> " " And C <> vbTab) Then
'Neither space nor tab.
'Test if already in argument.
If Not InArg Then
'New argument begins.
'Test for too many arguments.
If NumArgs = MaxArgs Then Exit For
NumArgs = NumArgs + 1
InArg = True
End If
'Concatenate character to current argument.
ArgArray(NumArgs) = ArgArray(NumArgs) & C
Else
'Found a space or tab.
'Set InArg flag to False.
InArg = False
End If
Next I
'Resize array just enough to hold arguments.
ReDim Preserve ArgArray(NumArgs)
'Return Array in Function name.
GetCommandLine = ArgArray()
End Function
Как бы там ни было, я считаю, что одного вызова Command в нашем случае вполне достаточно. Вряд ли кто-то будет сядеть и набивать десять аргументов для неконсольного приложения. Shell передаёт всегда один. Можем открыть то, что передано - открываем. Не можем - нефиг фигнёй страдать.
Написано это давно, но вот сейчас процитировал и вспомнил что в недавней одной мульке этого не добавил, хотя командная строка используется. On error resume next позволяет расслабиться. :)
----
Кто будет набивать? Зачем набивать - выделяете файлы и кладете их на значок приложения - вот вам и список. Умный юзверь еще скопирует ярлык апликухи в SendTo и будет класть на нее пачки файлов с помощью контекстного меню Проводника Send To >...
может скините исходничек простенький, а там я разберусь?
Для отладки впишите какое-нить полное имя файла в свойствах проекта (Command Line Arguments) и дебугайте. А живьем - через msgbox можно узнать что там валится.
msgbox Command$
ну нейдёт он. выводит ошибку 424?!
Свой код процитируйте.
ууу... он слишком большой тут наверно форума нехватит. а код такой же как и у вас.Private Function кладу в коде формы, а пример использования в событии Form Load.
Ну и что мессажбокс сообщает?
да ничего. выскакивает ошибка 424. я так понял ему надо какой-то объект.
Процитируйте тот самый кусок.
Private Sub Form_Load()
qw = 1
Dim s As String
Dim p() As String
'....
s = Command$
If Len(s) Then
p = Split(checkCommand(s), vbNullChar)
If UBound(p) > 0 Then
MsgBox "U have selected more than one file. Abort.", vbCritical
Else
s = p(0)
If fso.GetExtensionName(s) = "ai" Then
CommonDialog1.ShowOpen
f = FreeFile
On Error Resume Next
CommonDialog1.DialogTitle = "Загрузить текстовой файл"
Open CommonDialog1.FileName For Input As #f
Text1.Text = Input(LOF(1), 1)
Close #f
Form1.Caption = "not..." & "-" & CommonDialog1.FileName
End
End If
End If
End If
может я чего недопонимаю?
Код:
If fso.GetExtensionName(s) = "ai" Then
?
Допишите Option Explicit в самое начало кодов (Declaration Area), чтобы ошибки побыстрее отлавливать.
fso это File System Object (scrrun.dll) Microsoft Scripting Runtime. Если хотите использовать то нужно в референсы это добавить и дефайнить переменную так:
Код:
Dim fso as new FileSystemObject
Это та самая объектная переменная. Из-за нее и была у вас ошибка. Я же цитировал *свой* код. Вам нужно было его *интерпрентировать*, то есть, разобраться что к чему и выкинуть все лишнее вписав свое.
Расширение файла можно определить простыми текстовыми функциями, так что можете этот fso просто выкинуть. "ai" - является типом файлов Adobe Illustrator, а вы открываете текстовые, наверное txt?
То есть, либо добавьте указанную библиотеку в референс и создайте переменную fso как описано выше, и тогда проверяйте на расширение "txt", либо просто выкиньте всю эту проверку целиком.
If fso.GetExtensionName(s) = "ai" Then
End If
И еще, у вас там в теле кодов осталось End - это значит что программа будет полностью выгружена из памяти после того, как вы прочитаете текстовый файл. Так задумано? :)
Если захотите использовать FSO, то можете выкинуть и все эти встроенные басиковые функции чтения файлов. В FileSystemObject предусмотрен широкий спектр команд по работе с файлами и файловой системой. Смотрите их через Object Browser. Там не хватает только работы с бинарными данными, но поскольку у вас текстовый редактор, то вот сравните как осуществляется чтение файла с помощью фсо.
Код:
Dim fso as new FileSystemObject
dim ts as TextStream
dim s as string
set ts = fso.OpenTextFile(s, ForReading)
s = ts.ReadAll
dim ts as TextStream
dim s as string
set ts = fso.OpenTextFile(s, ForReading)
s = ts.ReadAll
В методе OpenTextFiles еще есть пара опциональных аргументов - создать файл и режим юникода.
Более короткая нотация:
Код:
s = fso.OpenTextFile(s, ForReading).ReadAll
В этом случае заводить переменную ts объекта TextStream не надо.
спасибо вам большое за разъяснение. заработало. интересная эта библиотека. только вы забыли сказать как её подключить, а кто непросвещённый скажу: нужно зайти в Проект(Project)>>Ссылки(Reference) и поставить галочку около библиотеки Microsoft Scriptig Runtime. теперь всегда буду использовать её. ещё раз спасибо.
и ещё раз уж создал эту тему. можно ли как нибудь открыть и вывести в текст бокс содержимое exe или ddl файла?
Можно. Только текстбокс не понимает неаски кодов и вы увидите там тоже самое что увидите открыв длл или екзе в блокноте.
То есть, можете тем же текстстримом читать бинарные файлы в строковы переменные. Я как-то читал фотошопский формат чтобы по-быстрому получить данные о размере и разрешении документа записанного в файл.
А вцелом большое тебе спасибо:)