|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Delphi | PChar into Cardinal |
|
|
Delphi - Delphi | PChar into Cardinal
|
Старожил Сообщения: 300 |
Профиль | Сайт | Отправить PM | Цитировать Чо-т голова совсем не варит... Как из PChar (или PAnsiChar) "сделать" тип Cardinal/Integer? Ну, к примеру, когда посылаешь сообщение WM_SETTEXT в lParam надо впихнуть указатель на строку, а в функции SendMessage lParam объявлен как Integer. Аналогично если действовать через TControl.Perform, то там lParam объявлен как Cardinal.
|
|
Отправлено: 14:33, 11-01-2005 |
Пользователь Сообщения: 84
|
Профиль | Отправить PM | Цитировать |
Отправлено: 15:30, 11-01-2005 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать Netscaper
Ура! В Дельфи оказывается тоже есть преобразование типов как в Си. Ура, ура! А почему я только щас об этом узнал? |
Отправлено: 15:34, 11-01-2005 | #3 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать Секундочку... Но если действовать так, то возникает Exception (в момент вызова Application.Run)
Form1.Controls[i*11].SetTextBuf(PChar(names[1,i+1])); Form1.Controls[i*11].Perform(WM_SETTEXT,0,Cardinal(PChar(names[1,i+1]))); Добавлено: Цитата Delphi Help:
Добавлено: Тут еще подумал. А такой массив случайно не рассматривается в Делфи как TStrings^ Нееее... Это уж действительно бред пошел. Пора вздремнуть хоть часок |
|
Последний раз редактировалось Savant, 11-01-2005 в 16:10. Отправлено: 15:43, 11-01-2005 | #4 |
Пользователь Сообщения: 84
|
Профиль | Отправить PM | Цитировать На рисунке сказано, что указанный индекс в списке выходит за пределы допустимых границ. Например, если на форме есть TListBox с 10 строчками, при обращении к 11 «вылезет» это исключение. Массив строк - не объект! Он не может рассматриватся как TStrings и т.п. Проверьте программу
|
|
Отправлено: 16:46, 11-01-2005 | #5 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать заснуть не удалось...
Netscaper, я знаю, когда "вылезает" это исключение, но вот не могу понять где (встроенный дебаггер даже строку с исключением найти не может, точнее может, но это строчка Application.Run; ). Повторюсь, что Цитата:
|
|
Отправлено: 17:09, 11-01-2005 | #6 |
Пользователь Сообщения: 84
|
Профиль | Отправить PM | Цитировать Если хочешь, зашли в оркестр, посмотрю, а то что-то с твоих слов не очень ясно...
|
Отправлено: 20:07, 11-01-2005 | #7 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать Netscaper, спасибо за хелпу, но с той проблемой (EListError) я уже рассчитался. Она происходила при вызове Form1.Controls[i] с несколько превышенным значением i. Соответственно заработали пребразования типов (я, кстати, нашел по ним наконец-то инфу в хелпе, в топике про округление дробных чисел ). Но никак не удается сменить жирность шрифта
Кстати, в чем я тут не прав? procedure TForm1.EditxChange(Sender: TObject); var a,b: Integer; s: String; begin // ShowMessage(IntToStr(Sizeof(s))); { !REMOVE! : debug info } Form1.Controls[Form1.ActiveControl.ComponentIndex].GetTextBuf(PChar(s), SizeOf(s)); { <-- ошибка EAccessViolation in 'user32.dll' } Val(s,a,b); if b<>0 then Form1.Controls[Form1.ActiveControl.ComponentIndex].SetTextBuf(PChar('0')) else if a>999999 then Form1.Controls[Form1.ActiveControl.ComponentIndex].SetTextBuf(PChar('999999')); end; И еще: можно ли получить хендл контрола на форме, если известен его номер? |
Отправлено: 23:41, 12-01-2005 | #8 |
Пользователь Сообщения: 84
|
Профиль | Отправить PM | Цитировать Savant
Цитата:
Помести на форму две кнопки: procedure TForm1.Button2Click(Sender: TObject); begin if (Form1.Controls[0] is TWinControl) then ShowMessage(IntToStr((Form1.Controls[0] as TWinControl).Handle)); ShowMessage(IntToStr((Button1 as TWinControl).Handle)); end; GetTextLen, GetTextBuf, Text Example - пример из Delphi Help Этот пример копирует текст из поля редактирования в строку, заканчивающуюся нулем, а также кладёт строку в другое поле, когда пользователь кликает на кнопке формы. procedure TForm1.Button1Click(Sender: TObject); var Buffer: PChar; Size: Byte; begin Size := Edit1.GetTextLen; {Получить длину строки Edit1} Inc(Size); {Добавляем 1 для нуля} GetMem(Buffer, Size); {Динамически создаем буфер} Edit1.GetTextBuf(Buffer,Size); {Копируем в буфер} Edit2.Text := StrPas(Buffer); {Конвертируем буфер в Паскалевскую строку Edit2} FreeMem(Buffer, Size);{ Освобождаем занятую память} end; Заметим, что такой же результат может быть получен проще: procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := Edit1.Text; end; |
|
Отправлено: 19:32, 13-01-2005 | #9 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать Netscaper, огромное спасибо за хелпу с получением текста, все отлично проворачивается.
Цитата Savent:
Цитата Delphi Help:
|
|||
Отправлено: 21:56, 13-01-2005 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Delphi - Delphi | UpperCase на Delphi 7 | Cognolio | Программирование и базы данных | 3 | 26-01-2006 15:42 | |
Delphi - Delphi | Zx | Программирование и базы данных | 3 | 27-08-2003 10:19 | |
Delphi - Delphi | Surround | Программирование и базы данных | 10 | 27-06-2003 17:58 | |
PChar | khvalera | Программирование и базы данных | 4 | 22-06-2003 18:12 | |
Delphi - Delphi | Roman Go | Программирование и базы данных | 11 | 11-12-2002 14:43 |
|