Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Delphi | PChar into Cardinal

Ответить
Настройки темы
Delphi - Delphi | PChar into Cardinal

Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Чо-т голова совсем не варит... Как из PChar (или PAnsiChar) "сделать" тип Cardinal/Integer? Ну, к примеру, когда посылаешь сообщение WM_SETTEXT в lParam надо впихнуть указатель на строку, а в функции SendMessage lParam объявлен как Integer. Аналогично если действовать через TControl.Perform, то там lParam объявлен как Cardinal.

Отправлено: 14:33, 11-01-2005

 

Аватара для Netscaper

Пользователь


Сообщения: 84
Благодарности: 0

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
var A : Cardinal;
      S : String;
begin
  A := Cardinal(PChar(S));
end;

Отправлено: 15:30, 11-01-2005 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Netscaper
Ура! В Дельфи оказывается тоже есть преобразование типов как в Си. Ура, ура!
А почему я только щас об этом узнал?

Отправлено: 15:34, 11-01-2005 | #3


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Изображения
Тип файла: png ну вот, обрадовался... =(.PNG
(9.1 Kb, 7 просмотров)

Секундочку... Но если действовать так, то возникает 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])));
Эти 2 куска кода должны вести себя одинаково, так? Но если заменить первый вторым, то смотрим на скриншот.

Добавлено:
Цитата Delphi Help:
EListError is raised when an error is made in a list, TStrings, or TStringList object.
Так у меня на форме нет списков и переменных TStrings тоже нет

Добавлено:
Тут еще подумал. А такой массив случайно не рассматривается в Делфи как TStrings^
Код: Выделить весь код
a: array[1..n] of string;
Нееее... Это уж действительно бред пошел. Пора вздремнуть хоть часок

Последний раз редактировалось Savant, 11-01-2005 в 16:10.


Отправлено: 15:43, 11-01-2005 | #4


Аватара для Netscaper

Пользователь


Сообщения: 84
Благодарности: 0

Профиль | Отправить PM | Цитировать


На рисунке сказано, что указанный индекс в списке выходит за пределы допустимых границ. Например, если на форме есть TListBox с 10 строчками, при обращении к 11 «вылезет» это исключение. Массив строк - не объект! Он не может рассматриватся как TStrings и т.п. Проверьте программу

Отправлено: 16:46, 11-01-2005 | #5


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


заснуть не удалось...

Netscaper, я знаю, когда "вылезает" это исключение, но вот не могу понять где (встроенный дебаггер даже строку с исключением найти не может, точнее может, но это строчка Application.Run; ). Повторюсь, что
Цитата:
у меня на форме нет списков и переменных TStrings тоже нет
, но зато есть КУЧА Static Text (по-дельфийски Labels), некоторым из которых в определенный момент времени надо поменять "жирность" шрифта (про SetText я тут просто для примера написал). Вот со сменой этой жирности я и мучаюсь . Что удивительно, у Form1.Controls[i] нет свойства TFont, которое есть у TControl, которым и является Form1.Controls[i]. Вот! Приходится через WinAPI выкручиваться, а там надо знать хендл конкретного контрола, который не знаю как найти, кроме функций поиска. Выкручиваемся соответственно через Form1.Controls[i].Perform(), но у него проблема с истолкованием PChar'a. Вот такая фигня...

Отправлено: 17:09, 11-01-2005 | #6


Аватара для Netscaper

Пользователь


Сообщения: 84
Благодарности: 0

Профиль | Отправить PM | Цитировать


Если хочешь, зашли в оркестр, посмотрю, а то что-то с твоих слов не очень ясно...

Отправлено: 20:07, 11-01-2005 | #7


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить 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;
В указанном месте возникает ошибка. Если эту строчку закомментировать и подставить какое-нибудь значение s, например s:='123', то все без проблем.

И еще: можно ли получить хендл контрола на форме, если известен его номер?

Отправлено: 23:41, 12-01-2005 | #8


Аватара для Netscaper

Пользователь


Сообщения: 84
Благодарности: 0

Профиль | Отправить 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


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Netscaper, огромное спасибо за хелпу с получением текста, все отлично проворачивается.

Цитата Savent:
можно ли получить хендл контрола на форме, если известен его номер?
Цитата Netscaper:
Можно. Если этот контрол есть твинконтрол
К величайшему сожалению TLabel оказался производным от TGraphicControl. Зато вчитавшись в справку нашел кое-что полезное для себя:
Цитата Delphi Help:
The TStaticText component functions like TLabel, except that it descends from TWinControl and therefore has a window handle. Use TStaticText instead of TLabel when the component’s accelerator key must belong to a windowed control — for example, on an ActiveX property page.
Самое важное выделил.

Отправлено: 21:56, 13-01-2005 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Delphi | PChar into Cardinal

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход