Delphi -> VB6

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

Delphi -> VB6

Сообщение Lunatic » 04.03.2008 (Вт) 17:38

Есть код на делфях. Как это можно представить на VB6


buf : array [1..250] of char;
......
SendMessage(RichViewEdit1.Handle, WM_GETTEXT, TextCount, integer(@buf));

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.03.2008 (Вт) 20:11

Код: Выделить всё
Dim buf(1 to 250) As Byte
SendMessage RichViewEdit1.Handle, WM_GETTEXT, TextCount, VarPtr(buf(1))
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Сообщение Lunatic » 04.03.2008 (Вт) 20:35

Ух ты! Никогда не слышал про такую функцию VarPtr
(Нужно будет книжек почитать :) )
В стандартной справке нету. Но в MSDN все таки нашел ее, хотя и с трудом.
Кстати с ней не работает. Масив пустой получается.
А вот если использовать
Код: Выделить всё
Dim buf(1 to 250) As Byte
SendMessage RichViewEdit1.Handle, WM_GETTEXT, TextCount, buf(1)

То всё работает нормально.
Странно! Ничего не могу понять. Мы ведь непосредственно указуем, индекс масива(1), а данные заносит и в другие слоты.
Впринцыпе главное что работает всё. Хотя я всё равно в недоумении. Действительно нужно за теорию взятся. :shock: Всё я в библиотеку :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.03.2008 (Вт) 21:01

Это значит, что в объявлении функции стоит гадкий ByRef.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Сообщение Lunatic » 05.03.2008 (Ср) 3:30

Может вопрос немного не в этой теме должен создаватся, но всё же.
Я отправляю текст окну через
Код: Выделить всё
SendMessage wWnd, WM_SETTEXT, Len(PasteString) + 1, ByVal PasteString


Как можно переместить курсор в первоначальное положение, в то в каком он был до вставки текста(тоесть в конец строки. А то его забивает в начало строки)
Может нужно использовать не SetText или есть еще какая-то API, переводящая курсор в конец строки?

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 05.03.2008 (Ср) 8:17

Нет, нужно сначала запомнить позицию курсора WM_GETSEL, а потом поставить на место WM_SETSEL
А я все практикую лечение травами...

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

Сообщение alibek » 05.03.2008 (Ср) 9:36

Хакер писал(а):Это значит, что в объявлении функции стоит гадкий ByRef.

ByRef As Any - самое оптимальное и универсальное.
Lasciate ogni speranza, voi ch'entrate.

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Сообщение Lunatic » 05.03.2008 (Ср) 12:28

Ту Twister - сенк!
А не подскажете значение констант
WM_GETSEL
WM_SETSEL
В моей справке по API я их вообще не нашел(EM_GETSEL только), даже гугл ничего внятного не смог сказать. Так нашел пару примеров их применения, а вот сами значения незнаю.
Код: Выделить всё
c_Pos = SendMessage(wWnd, WM_GETSEL, 0, 0)
SendMessage wWnd, WM_SETSEL, 0, с_Pos

Вот примерчик что я нашел.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 05.03.2008 (Ср) 12:50

В моей справке по API я их вообще

А какая у тебя справка? :wink:
Я, для этих целей, юзаю ApiViewer 2004 (не путать с APIGuide - это полная лажа).
А я все практикую лечение травами...

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Сообщение Lunatic » 05.03.2008 (Ср) 14:11

ApiViewer 2004 v.3.10

Win32api.apv v.3.00
08.08.2004

Declarations:6189
Constants:52940
Types:479
Enumerations:9


Если у кого-то есть поновее. Буду благодарен за линк. Потому что у себя я не могу найти эти константы. Или просто выложите их значения

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 05.03.2008 (Ср) 14:26

Прости, я запарился - таких констант нет.
Есть константы EM_ - EditMessage
А я все практикую лечение травами...

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Сообщение Lunatic » 06.03.2008 (Чт) 0:41

Hello Dave,

A possible work-around is to SendMessage
(http://msdn2.microsoft.com/EN-US/library/ms644950.aspx) WM_GETSEL to get
the current selection of text in a specified handle. But it may complicates
the solution. I am still waiting for Product team's response, to see if
they have better resolutions. Thanks for your patience.

Regards,
Jialiang Ge (jialge@online.microsoft.com, remove 'online.')
Microsoft Online Community Support


Я сам запутался. Есть ли эти константы или нет?!=)

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 06.03.2008 (Чт) 1:17

Код: Выделить всё
Public Const EM_EXGETSEL = &H434
Public Const EM_EXSETSEL = &H437
Public Const EM_AUTOURLDETECT As Long = (WM_USER + 91)
Public Const EM_CANPASTE As Long = (WM_USER + 50)
Public Const EM_CANREDO As Long = (WM_USER + 85)
Public Const EM_CHARFROMPOS As Long = &HD7
Public Const EM_CANUNDO As Long = &HC6
Public Const EM_CONVPOSITION As Long = (WM_USER + 108)
Public Const EM_DISPLAYBAND As Long = (WM_USER + 51)
Public Const EM_EXLIMITTEXT As Long = (WM_USER + 53)
Public Const EM_EXLINEFROMCHAR As Long = (WM_USER + 54)
Public Const EM_EXSETSEL As Long = (WM_USER + 55)
Public Const EM_FINDTEXT As Long = (WM_USER + 56)
Public Const EM_FINDTEXTEX As Long = (WM_USER + 79)
Public Const EM_FINDTEXTEXW As Long = (WM_USER + 124)
Public Const EM_FINDTEXTW As Long = (WM_USER + 123)
Public Const EM_FINDWORDBREAK As Long = (WM_USER + 76)
Public Const EM_FMTLINES As Long = &HC8
Public Const EM_FORMATRANGE As Long = (WM_USER + 57)
Public Const EM_GETAUTOURLDETECT As Long = (WM_USER + 92)
Public Const EM_GETBIDIOPTIONS As Long = (WM_USER + 201)
Public Const EM_GETCHARFORMAT As Long = (WM_USER + 58)
Public Const EM_GETEDITSTYLE As Long = (WM_USER + 205)
Public Const EM_GETEVENTMASK As Long = (WM_USER + 59)
Public Const EM_GETFIRSTVISIBLELINE As Long = &HCE
Public Const EM_GETHANDLE As Long = &HBD
Public Const EM_GETIMECOLOR As Long = (WM_USER + 105)
Public Const EM_GETIMECOMPMODE As Long = (WM_USER + 122)
Public Const EM_GETIMEMODEBIAS As Long = (WM_USER + 127)
Public Const EM_GETIMEOPTIONS As Long = (WM_USER + 107)
Public Const EM_GETLANGOPTIONS As Long = (WM_USER + 121)
Public Const EM_GETIMESTATUS As Long = &HD9
Public Const EM_GETLINE As Long = &HC4
Public Const EM_GETLINECOUNT As Long = &HBA
Public Const EM_GETMODIFY As Long = &HB8
Public Const EM_GETMARGINS As Long = &HD4
Public Const EM_GETOLEINTERFACE As Long = (WM_USER + 60)
Public Const EM_GETOPTIONS As Long = (WM_USER + 78)
Public Const EM_GETPARAFORMAT As Long = (WM_USER + 61)
Public Const EM_GETPASSWORDCHAR As Long = &HD2
Public Const EM_GETPUNCTUATION As Long = (WM_USER + 101)
Public Const EM_GETRECT As Long = &HB2
Public Const EM_GETREDONAME As Long = (WM_USER + 87)
Public Const EM_GETSCROLLPOS As Long = (WM_USER + 221)
Public Const EM_GETSEL As Long = &HB0
Public Const EM_GETSELTEXT As Long = (WM_USER + 62)
Public Const EM_GETTEXTEX As Long = (WM_USER + 94)
Public Const EM_GETTEXTLENGTHEX As Long = (WM_USER + 95)
Public Const EM_GETTEXTMODE As Long = (WM_USER + 90)
Public Const EM_GETTEXTRANGE As Long = (WM_USER + 75)
Public Const EM_GETTHUMB As Long = &HBE
Public Const EM_GETTYPOGRAPHYOPTIONS As Long = (WM_USER + 203)
Public Const EM_GETUNDONAME As Long = (WM_USER + 86)
Public Const EM_GETWORDBREAKPROC As Long = &HD1
Public Const EM_GETWORDBREAKPROCEX As Long = (WM_USER + 80)
Public Const EM_GETWORDWRAPMODE As Long = (WM_USER + 103)
Public Const EM_GETZOOM As Long = (WM_USER + 224)
Public Const EM_HIDESELECTION As Long = (WM_USER + 63)
Public Const EM_LIMITTEXT As Long = &HC5
Public Const EM_LINEFROMCHAR As Long = &HC9
Public Const EM_LINEINDEX As Long = &HBB
Public Const EM_LINELENGTH As Long = &HC1
Public Const EM_LINESCROLL As Long = &HB6
Public Const EM_OUTLINE As Long = (WM_USER + 220)
Public Const EM_PASTESPECIAL As Long = (WM_USER + 64)
Public Const EM_POSFROMCHAR As Long = (WM_USER + 38)
Public Const EM_RECONVERSION As Long = (WM_USER + 125)
Public Const EM_REDO As Long = (WM_USER + 84)
Public Const EM_REPLACESEL As Long = &HC2
Public Const EM_REQUESTRESIZE As Long = (WM_USER + 65)
Public Const EM_SCROLL As Long = &HB5
Public Const EM_SCROLLCARET As Long = &HB7
Public Const EM_SELECTIONTYPE As Long = (WM_USER + 66)
Public Const EM_SETBIDIOPTIONS As Long = (WM_USER + 200)
Public Const EM_SETBKGNDCOLOR As Long = (WM_USER + 67)
Public Const EM_SETCHARFORMAT As Long = (WM_USER + 68)
Public Const EM_SETCUEBANNER As Long = (ECM_FIRST + 1)
Public Const EM_SETEDITSTYLE As Long = (WM_USER + 204)
Public Const EM_SETEVENTMASK As Long = (WM_USER + 69)
Public Const EM_SETFONTSIZE As Long = (WM_USER + 223)
Public Const EM_SETHANDLE As Long = &HBC
Public Const EM_SETIMECOLOR As Long = (WM_USER + 104)
Public Const EM_SETIMEMODEBIAS As Long = (WM_USER + 126)
Public Const EM_SETIMEOPTIONS As Long = (WM_USER + 106)
Public Const EM_SETIMESTATUS As Long = &HD8
Public Const EM_SETLANGOPTIONS As Long = (WM_USER + 120)
Public Const EM_SETLIMITTEXT As Long = EM_LIMITTEXT
Public Const EM_SETMARGINS As Long = &HD3
Public Const EM_SETMODIFY As Long = &HB9
Public Const EM_SETOLECALLBACK As Long = (WM_USER + 70)
Public Const EM_SETOPTIONS As Long = (WM_USER + 77)
Public Const EM_SETPALETTE As Long = (WM_USER + 93)
Public Const EM_SETPARAFORMAT As Long = (WM_USER + 71)
Public Const EM_SETPASSWORDCHAR As Long = &HCC
Public Const EM_SETPUNCTUATION As Long = (WM_USER + 100)
Public Const EM_SETREADONLY As Long = &HCF
Public Const EM_SETRECT As Long = &HB3
Public Const EM_SETRECTNP As Long = &HB4
Public Const EM_SETSCROLLPOS As Long = (WM_USER + 222)
Public Const EM_SETSEL As Long = &HB1
Public Const EM_SETTABSTOPS As Long = &HCB
Public Const EM_SETTARGETDEVICE As Long = (WM_USER + 72)
Public Const EM_SETTEXTEX As Long = (WM_USER + 97)
Public Const EM_SETTEXTMODE As Long = (WM_USER + 89)
Public Const EM_SETTYPOGRAPHYOPTIONS As Long = (WM_USER + 202)
Public Const EM_SETUNDOLIMIT As Long = (WM_USER + 82)
Public Const EM_SETWORDBREAKPROC As Long = &HD0
Public Const EM_SETWORDBREAKPROCEX As Long = (WM_USER + 81)
Public Const EM_SETWORDWRAPMODE As Long = (WM_USER + 102)
Public Const EM_SETZOOM As Long = (WM_USER + 225)
Public Const EM_SHOWSCROLLBAR As Long = (WM_USER + 96)
Public Const EM_STOPGROUPTYPING As Long = (WM_USER + 88)
Public Const EM_STREAMIN As Long = (WM_USER + 73)
Public Const EM_STREAMOUT As Long = (WM_USER + 74)
Public Const EM_UNDO As Long = &HC7

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 06.03.2008 (Чт) 7:45

Нет, есть только сообщения EM...
А я все практикую лечение травами...

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 11.03.2008 (Вт) 11:33

а может ктото поможет перевести и этот код?

Код: Выделить всё
USES DBITYPES, DBIPROCS, DBIERRS, DB, WINPROCS, SYSUTILS;

PROCEDURE CHANGELANGDRIVER(DATABASENAME, TABLENAME, LDNAME: STRING);
VAR
  TBLEXT: STRING;
  DATABASE: TDATABASE;
  TBLDESC: CRTBLDESC;
  OPTDESC: FLDDESC;
  OPTDATA: ARRAY [0..250] OF CHAR;
  CUR: HDBICUR;
  REC: CFGDESC;
BEGIN
  IF (TABLENAME='') OR (LDNAME='') THEN
    RAISE EXCEPTION.CREATE('UNKNOWN TABLENAME OR LDNAME');
  DATABASE:=SESSION.OPENDATABASE(DATABASENAME);
  TRY
    IF DATABASE.ISSQLBASED THEN RAISE EXCEPTION.CREATE('FUNCTION
CHANGELANGDRIVER WORKING ONLY WITH DBASE OR  PARADOX  TABLES');
    FILLCHAR(OPTDESC, SIZEOF(OPTDESC), #0);
    FILLCHAR(TBLDESC, SIZEOF(TBLDESC), #0);
    STRCOPY(OPTDESC.SZNAME, 'LANGDRIVER');
    OPTDESC.ILEN:=LENGTH(LDNAME)+1;
    WITH TBLDESC DO
    BEGIN
      STRPCOPY(SZTBLNAME, TABLENAME);
      TBLEXT:=UPPERCASE(EXTRACTFILEEXT(TABLENAME));
      IF TBLEXT='DBF' THEN STRCOPY(SZTBLTYPE, SZDBASE)
      ELSE IF TBLEXT='.DB' THEN STRCOPY(SZTBLTYPE, SZPARADOX)
      ELSE BEGIN
        ANSITOOEM(STRPCOPY(OPTDATA, DATABASENAME), OPTDATA);
        IF DBIOPENCFGINFOLIST(NIL, DBIREADONLY, CFGPERSISTENT,
          STRPCOPY(OPTDATA, '\DATABASES\'+STRPAS(OPTDATA)+'\DB INFO\'),
CUR)<>DBIERR_NONE
          THEN RAISE EXCEPTION.CREATE('UNKNOWN TABLE TYPE');
        TRY
          WHILE DBIGETNEXTRECORD(CUR, DBINOLOCK, @REC, NIL)<>DBIERR_EOF DO
            IF STRCOMP(REC.SZNODENAME, 'DEFAULT DRIVER')=0 THEN
            BEGIN
              STRCOPY(SZTBLTYPE, REC.SZVALUE);
              BREAK;
            END;
        FINALLY
          CHECK(DBICLOSECURSOR(CUR));
        END;
      END;
      IOPTPARAMS:=1;
      PFLDOPTPARAMS:=@OPTDESC;
      POPTDATA:=@OPTDATA;
    END;
    STRPCOPY(OPTDATA, LDNAME);
    CHECK(DBIDORESTRUCTURE(DATABASE.HANDLE, 1, @TBLDESC, NIL,
      NIL, NIL, FALSE));
  FINALLY
    SESSION.CLOSEDATABASE(DATABASE);
  END;
END;

Примеры использования:

CHANGELANGDRIVER('C:\DELPHI\DEMOS\DATA', 'CLIENTS.DBF', 'DB866RU0');

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 11.03.2008 (Вт) 12:09

Я могу.
Но не буду.
И вряд ли кто будет.
Блин, ну это элементарно - от тебя требуется немного желания и старания. :?
А я все практикую лечение травами...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 11.03.2008 (Вт) 13:09

А то что в этом коде используются спецфические для Delphi классы эт ничего? Или их тоже переписать? :)
Весь мир матрица, а мы в нем потоки байтов!

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 11.03.2008 (Вт) 13:16

ага ,желание и старание есть но этот делфя для меня тёмный лес! вот скожи шо такое SESSION, CHECK, STRPCOPY ? также шо такое
TDATABASE;
CRTBLDESC;
FLDDESC;
?
догадываюсь про DBIGETNEXTRECORD и про ANSITOOEM но как ANSITOOEM на бейсике будет не догадываюсь
и это шо такое IOPTPARAMS:=1;
PFLDOPTPARAMS:=@OPTDESC;
POPTDATA:=@OPTDATA;
?
также незнаю и про DBICLOSECURSOR(CUR)
еслиб ешо подсказали и про STRCOMP(REC.SZNODENAME шо такое REC.SZNODENAME ? да и DBIOPENCFGINFOLIST первый раз вижу
также не доганяю и про DBIDORESTRUCTURE

Viper писал(а):А то что в этом коде используются спецфические для Delphi классы эт ничего? Или их тоже переписать? :)


незнаю, я в делфях темный лес , чайник , даже не юзер , я даже название делфи по английски сразу ненапишу

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 11.03.2008 (Вт) 13:35

ладно, если там нельзя ничего сделать, то может тут мона?
Код: Выделить всё
VAR LIST:TSTRINGS;
.......
BEGIN
  .......
  LIST.ADD ('LANGDRIVER=DB866RU0');
  .......
  SESSION.MODIFYDRIVER('DBASE',LIST);
  .......
END;

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 12.03.2008 (Ср) 7:16

А то что в этом коде используются спецфические для Delphi классы эт ничего? Или их тоже переписать?
Нет, можно найти альтернативный метод, выполняющий те же функции. Если это, конечно, не контрол, хотя и тот можно заюзать в VB , если сильно захочется.

Бяка
О том, что делают функции STRPCOPY, STRCOMP можно догадаться по названию.
Что за тип TDATABASE можно догадаться по тем же признакам.

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

ладно, если там нельзя ничего сделать, то может тут мона?
Создается переменная типа TStrings - это просто список строк, далее она должна инициализироваться, но этот кусок кода ты пропустил. Потом в этот список добавляется строка 'LANGDRIVER=DB866RU0'. SESSION, скорее всего, есть аналог Workspase в VBA.
Код
Код: Выделить всё
SESSION.MODIFYDRIVER('DBASE',LIST);
, скорее всего, изменяет языковой драйвер для текущей сессии связи с данными для баз данных типа DBASE. Второй параметр, как уже ясно, имя драйвера. Только вот зачем принимается не строка, а список строк можно только догадываться...
А я все практикую лечение травами...

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 13.03.2008 (Чт) 0:37

Twister писал(а):
А... Потом в этот список добавляется строка 'LANGDRIVER=DB866RU0'. SESSION, скорее всего, есть аналог Workspase в VBA.
Код
Код: Выделить всё
SESSION.MODIFYDRIVER('DBASE',LIST);
, скорее всего, изменяет языковой драйвер для текущей сессии связи с данными для баз данных типа DBASE. Второй параметр, как уже ясно, имя драйвера. ...
вот вот, мне то какраз и нужно реализовать "изменяет языковой драйвер для текущей сессии связи с данными для баз данных типа" только типа Paradox но это неважно ибо DBASE от Paradox недалеко ушло, мне нужно это на VB написать!!! только мне нужно 'LANGDRIVER=ancyrr'


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

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

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

    TopList