Как в VB реализовать старое LOCATE X , Y

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Как в VB реализовать старое LOCATE X , Y

Сообщение Andrey A Kireev » 01.03.2004 (Пн) 10:52

Мне нужно сделпть форму по типу HEX Вьювера.
Чтобы нужные мне символы располагались таблично.
Когдато под ДОСом я рисовал такие вьюверы используя старую команду LOCATE + цикл в цикле и данные разрисовывались в табличке как и было нужно.
Попытался попытался это реализовать через Grid жутко не понравилось.
Искал примеры реализации HEX Вьюверов и не нашол ни одного.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.03.2004 (Пн) 11:10

multiline textbox, моноширинный шрифт.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 01.03.2004 (Пн) 11:36

Такой подход мне не пойдет.
Во первых не хочется опираться на моноширинники мне нужно помимо обычных HEX значений выводить ANSI и ASCI символику.
Мне нужно сделать некое подобие тогоже WinHex или HexWorkShop но с некоторыми особенностями которых нет в обычных редакторах.
К примеру мне нужна динамическая (по ширине) таблица, чтобы в строке было не 8 или 16 символов а столько сколько надо.
Данная прога нужна для анализа сложных бинарных кодов с табличными структурами корорые зачастую варьируются от того где это применяется.
Есть еще несколько критериев которые отсутствуеют в обычных редакторах. Именно поэтому я делаю прогу по прообразу но со своими требованиями.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.03.2004 (Пн) 11:39

.CurrentX, .CurrentY (для Form или PictureBox)
Lasciate ogni speranza, voi ch'entrate.

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 01.03.2004 (Пн) 11:44

А поподробней можно или с примером, я этого не встречал.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.03.2004 (Пн) 11:47

У формы должно быть AutoRedraw=True, ScaleMode=3
Код: Выделить всё
Cls
Print "Test1"
CurrentX = 50
CurrentY = 50
Print "Test2"
Lasciate ogni speranza, voi ch'entrate.

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 01.03.2004 (Пн) 12:00

Перешерстил свои мануалы нашол применение только для обьекта Printer. :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.03.2004 (Пн) 12:03

Плохо искал, хорошо искал - нашёл бы... :wink:
Применяется и к форме.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.03.2004 (Пн) 12:03

Эти методы применимы для Printer, Form и PictureBox. Если имя объекта не указано (и код выполняется на форме), то они применяются к текущей форме. Т.е. по идее надо было писать Me.Cls, Me.Print.
Lasciate ogni speranza, voi ch'entrate.

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 01.03.2004 (Пн) 12:03

Опс, уже заметил. БигСенькью буду прбовать таким способом.

Но буду надеяться что всетаки смогу найти примеры или исходники какого нибудь хексера или аналогичного вьювера.

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 01.03.2004 (Пн) 12:18

Да кстати как я уже успел опробовать.
Расчет координатной сетки идет по метрике самой формы.
Если мериться твипами, то вместо таблици получается черный квадрат :) символы один на одном.
Есть ли метрика символьная. ил придется изголяться пересчетами разрешения на пиксели формы с учетом размеров юзаемого шрифта. :)

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 01.03.2004 (Пн) 12:26

Во и с этим разобрался. Метрику берем Charecter.
На кнопке вешаем это:

Private Sub Command1_Click()
Cls
a = 0
For y = 1 To 32 Step 1
For x = 1 To 32 Step 2
CurrentX = x
CurrentY = y
Print a
a = a + 1
Next x
Next y
End Sub

Ну чем не таблица по принципам сторого ДОС экрана.

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 03.03.2004 (Ср) 12:38

Вот накропал небольшой набросок того что делаю.
По результату возникли два возможно ламерских вопроса.
Код: Выделить всё

Private Sub Command1_Click()
    Cls
    Dim MyFilePosition As Long 'переменная позиции
    MyFilePosition = 1 'начальное значение
    Dim MySimbol As Byte 'переменная символа
    Open TextPole.Text For Binary As #1 Len = 1
    'Это уже реализация просмотра файла
    For y = 0 To 16
    For x = 0 To 2 * 16 Step 2
    Get #1, MyFilePosition, MySimbol 'достаем символ
    CurrentX = x
    CurrentY = y
    Print Chr(MySimbol) ' рисуем его
    'даем следующие смещение
    MyFilePosition = MyFilePosition + 1
    Next x
    Next y
    Close #1
End Sub

Private Sub Drive1_Change()
    'выбираем диск
    Dir1.Path = Drive1.Drive
End Sub
Private Sub Dir1_Change()
    'выбираем путь
    File1.Path = Dir1.Path
End Sub

Private Sub File1_Click()
    'получаем полное имя файла с путем и риуем его в поле
    TextPole.Text = File1.Path + "\" + File1.FileName
End Sub

'Вот тут замечается два больших бага.
'1.Все работает открывается и смотрится из любого места
'места кроме корневого каталога. Тут вылазиет лишний слеш.
'2.И еще один баг который мне совершенно не понятен.
'Если заметно, то полное имя файла с путем формируется не
'в переменную, а сразу лепится в эелемент формы!!!
'(Это какараз последние строки)
'Если использовать какую либо переменную файл не откроется
'будет кричать и ругаться.
'Обьявление этой переменной как String не помогает.
Вложения
MyFileOpen.zip
(2.43 Кб) Скачиваний: 34

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 04.03.2004 (Чт) 11:27

Ну че, некому даже коментарий дать? :cry:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.03.2004 (Чт) 12:14

Код: Выделить всё
Option Explicit

Private Sub Drive1_Change()
  Dir1.Path = Drive1.Drive
End Sub

Private Sub Dir1_Change()
  File1.Path = Dir1.Path
End Sub

Private Sub File1_DblClick()
  Dim x As Long, y As Long
  Dim MySymbol(1 To 16) As Byte
 
  Me.Cls
  Open IfSlash(File1.Path) + File1.FileName For Binary Access Read As #1
 
  For y = 0 To 16
    Get #1, , MySymbol
    Me.CurrentY = y
    For x = 1 To 16
      Me.CurrentX = x * 2
      Me.Print Chr$(MySymbol(x));
    Next
  Next
  Close #1
End Sub

Private Function IfSlash(s As String) As String
  If Right$(s, 1) = "\" Then IfSlash = s Else IfSlash = s + "\"
End Function
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 04.03.2004 (Чт) 12:53

Это на сколь я понимаю, простой способ проверки на наличие слеша в конце строки, если нет то его добавить.
Сенкс, добавлю эту тонкость себе в код.

А по второму приколу будут ли замечания или советы.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.03.2004 (Пт) 11:19

Вообще-то, обоих приколов уже нет :roll:
Текстбокс удаляй, и кнопку тоже. Просто с даблклика по имени файла всё работает.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey A Kireev
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 06.11.2003 (Чт) 10:05

Сообщение Andrey A Kireev » 05.03.2004 (Пт) 12:09

В любой ситуации можно обойти проблему.
Я это уже и через CommonDialog реализовал и игрался другими способами.
Просто хочется в таких местах которые все предпочитают обходить всетаки разобраться.
Я предпочел именно такую навигацию по FS только из-за того что в дальнейшем под рукой нужно окошко с другими файлами в папке. Тоесть мненужен под ркой постоянно FileLisbBox, а CommonDialog его мне не заменит, если только через комон не получать нужную директорию вместо файла, а сами файла выводить в отдельном окне.
Получить через CommonDialog каталог вместо конкретного файла мне пока не удалось.
Вот пример того как я игрался с CommonDialog, возможно он пригодится другим начинающим как пример того как следить за работой любых диалогов от и до.
Код: Выделить всё
'Данный пример визуально дает представление
'о том как управлять CommonDialog-ами
'а также следить за результатами из работы
'на примере CommonDialog1.ShowOpen
Private Sub Command1_Click()
    Cls
'Тут играемся с настройками диалога
'Action
'    CommonDialog1.Action = ???
'    Print "HelpCommand", CommonDialog1.Action
'DefaultExt
    CommonDialog1.DefaultExt = ".txt"
    Print "DefaultExt", CommonDialog1.DefaultExt
'DialogTitle
    CommonDialog1.DialogTitle = "MyDialogTitle for OpenFile"
    Print "DialogTitle", CommonDialog1.DialogTitle
'Filter
    CommonDialog1.Filter = "Text(*.txt)|*.txt|MSWord (*.doc)|*.doc|AllFiles(*.*)|*.*|"
    Print "Filter", CommonDialog1.Filter
'HelpCommand
'    CommonDialog1.HelpCommand = ???
'    Print "HelpCommand", CommonDialog1.HelpCommand
'HelpContextID
'    CommonDialog1.HelpContextID = ???
'    Print "HelpContextID", CommonDialog1.HelpContextID
'HelpFile
'    CommonDialog1.HelpFile = ???
'    Print "HelpFile", CommonDialog1.HelpFile
'HelpKey
'    CommonDialog1.HelpKey = ???
'    Print "HelpKey", CommonDialog1.HelpKey
'InitDir - Стартовый каталог
    CommonDialog1.InitDir = "C:\windows\"
    Print "InitDir", CommonDialog1.InitDir
'Не забудьте на форме установить AutoRedraw=True
'иначе открывшаяся форма сотрет результаты установок
'Теперь откроем диалог
    CommonDialog1.ShowOpen
    Cls
'Теперь выведем на экран все результаты диалога
'CancelError - Контроль ошибок
    MyCancelError = CommonDialog1.CancelError
    Print "CancelError", MyCancelError
'FileName - полное имя файла с путем
    MyFileName$ = CommonDialog1.FileName
    Print "FileName", MyFileName$
'FileTitle - только имя файла
    MyFileTitle$ = CommonDialog1.FileTitle
    Print "FileTitle", MyFileTitle$
'FilterIndex
    MyFilterIndex = CommonDialog1.FilterIndex
    Print "FilterIndex", MyFilterIndex
'Flags
    MyFlags = CommonDialog1.Flags
    Print "Flags", MyFlags
'MaxFileSize
    MyMaxFileSize = CommonDialog1.MaxFileSize
    Print "MaxFileSize", MyMaxFileSize
End Sub
'Если у кого есть что добавить, то добавляйте :)
Вложения
ComonControlOpen.zip
(2.19 Кб) Скачиваний: 30


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 17

    TopList