Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

открытие ткстовых документов своей прогой.

403
24 июня 2006 года
ace lighting
411 / / 05.05.2006
подскажите как открывать своей программой, которую ты сделал сам, текстовые документы, из контекстного меню explorera : открыть с помощью\моя программа. когда я пытаюсь так открыть, то у меня в моём текстовом редакторе пусто. помогите. а? заранее спасибо:)
534
25 июня 2006 года
HarryAxe
448 / / 19.01.2006
Надо получить имя файла из коммандной строки. Делается элементарно, путём вызова функции Command:
 
Код:
Dim strFileName As String
strFileName = Command
16K
25 июня 2006 года
kostyanet
24 / / 23.06.2006
Upd. Пока писал уже ответил, ну, пусть будет еще. :)

-----------------

Передать имя файла (файлов) в качестве аргументов командной строки. В коде получить их из функции 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 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
534
25 июня 2006 года
HarryAxe
448 / / 19.01.2006
А вот вариант из майкрософтовского хэлпа:

Код:
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
534
25 июня 2006 года
HarryAxe
448 / / 19.01.2006
Как бы там ни было, я считаю, что одного вызова Command в нашем случае вполне достаточно. Вряд ли кто-то будет сядеть и набивать десять аргументов для неконсольного приложения. Shell передаёт всегда один. Можем открыть то, что передано - открываем. Не можем - нефиг фигнёй страдать.
16K
25 июня 2006 года
kostyanet
24 / / 23.06.2006
Ха, прикол, значит не такое уж и убоище у меня получилось.

Написано это давно, но вот сейчас процитировал и вспомнил что в недавней одной мульке этого не добавил, хотя командная строка используется. On error resume next позволяет расслабиться. :)

----

Кто будет набивать? Зачем набивать - выделяете файлы и кладете их на значок приложения - вот вам и список. Умный юзверь еще скопирует ярлык апликухи в SendTo и будет класть на нее пачки файлов с помощью контекстного меню Проводника Send To >...
403
25 июня 2006 года
ace lighting
411 / / 05.05.2006
что-то у меня ничего не получается. всё попробовал.
может скините исходничек простенький, а там я разберусь?
16K
25 июня 2006 года
kostyanet
24 / / 23.06.2006
Наверху же два варианта обработки, а сам "исходник" это s = Command$. Куда исходнее? :)

Для отладки впишите какое-нить полное имя файла в свойствах проекта (Command Line Arguments) и дебугайте. А живьем - через msgbox можно узнать что там валится.

msgbox Command$
403
25 июня 2006 года
ace lighting
411 / / 05.05.2006
ну нейдёт он. выводит ошибку 424?!
16K
25 июня 2006 года
kostyanet
24 / / 23.06.2006
Свой код процитируйте.
403
26 июня 2006 года
ace lighting
411 / / 05.05.2006
ууу... он слишком большой тут наверно форума нехватит. а код такой же как и у вас.Private Function кладу в коде формы, а пример использования в событии Form Load.
16K
27 июня 2006 года
kostyanet
24 / / 23.06.2006
Ну и что мессажбокс сообщает?
403
27 июня 2006 года
ace lighting
411 / / 05.05.2006
да ничего. выскакивает ошибка 424. я так понял ему надо какой-то объект.
16K
28 июня 2006 года
kostyanet
24 / / 23.06.2006
Процитируйте тот самый кусок.
403
28 июня 2006 года
ace lighting
411 / / 05.05.2006
'Вот он
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

может я чего недопонимаю?
16K
28 июня 2006 года
kostyanet
24 / / 23.06.2006
А это вам зачем:

 
Код:
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 - это значит что программа будет полностью выгружена из памяти после того, как вы прочитаете текстовый файл. Так задумано? :)
16K
29 июня 2006 года
kostyanet
24 / / 23.06.2006
Вне данного вопроса но в целом касательно этого куска кода.

Если захотите использовать 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


В методе OpenTextFiles еще есть пара опциональных аргументов - создать файл и режим юникода.

Более короткая нотация:

 
Код:
s = fso.OpenTextFile(s, ForReading).ReadAll


В этом случае заводить переменную ts объекта TextStream не надо.
403
29 июня 2006 года
ace lighting
411 / / 05.05.2006
спасибо вам большое за разъяснение. заработало. интересная эта библиотека. только вы забыли сказать как её подключить, а кто непросвещённый скажу: нужно зайти в Проект(Project)>>Ссылки(Reference) и поставить галочку около библиотеки Microsoft Scriptig Runtime. теперь всегда буду использовать её. ещё раз спасибо.
403
29 июня 2006 года
ace lighting
411 / / 05.05.2006
и ещё раз уж создал эту тему. можно ли как нибудь открыть и вывести в текст бокс содержимое exe или ddl файла?
16K
05 июля 2006 года
kostyanet
24 / / 23.06.2006
Что значит "забыл сказать", я же написал - в референсы воткнуть. Это же элементарная школа.

Можно. Только текстбокс не понимает неаски кодов и вы увидите там тоже самое что увидите открыв длл или екзе в блокноте.

То есть, можете тем же текстстримом читать бинарные файлы в строковы переменные. Я как-то читал фотошопский формат чтобы по-быстрому получить данные о размере и разрешении документа записанного в файл.
403
05 июля 2006 года
ace lighting
411 / / 05.05.2006
" - в референсы воткнуть. " - вот то - то и оно! будь я новичком в этом деле, я бы не понял вообще про какие Реферансы идёт речь и где они вообще находяться.
А вцелом большое тебе спасибо:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог