Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
ВнизВ D7 [Warning] Main.pas(753): Unsafe type PChar Найти похожие ветки
← →
Юрий К (2005-01-28 16:30) [0]Попробовал после D5 скомпилить проект в D7.
Получаю следующие предупреждения на объявления типа "pBuf: PCHAR;"
[Warning] Main.pas(753): Unsafe type "PChar"
Что нужно делать в этом случае?
← →
mrcat1 (2005-01-28 16:38) [1]{$WARN UNSAFE_CODE OFF}
← →
Igor_thief (2005-01-28 16:39) [2]Юрий К (28.01.05 16:30)
В настроечках снять галочку.
← →
PVOzerski © (2005-01-28 16:41) [3]А тебе они мешают? Если собираешься потом заняться .NET, чтение этих сообщений скорее полезно, IMHO.
← →
Юрий К (2005-01-28 17:17) [4]Далее:
with cmbA do begin
if (Items.Count > 0) then exit;
Items.Add("");
...
end;
if (Items.Count > 0) then begin
Text := Items[0];
end;
end;
На строке "Text := Items[0]" вылетает, чего не было в D5.
Если заменить "Items.Add("")" на "Items.Add(" ")", то нормально проходится код. Нельзя что ли пустую строку добавлять?
← →
Юрий К (2005-01-28 17:22) [5]"В настроечках снять галочку."
Какую? Чтобы не перепутать.
← →
begin...end © (2005-01-28 18:16) [6]> [4] Юрий К (28.01.05 17:17)
> На строке "Text := Items[0]" вылетает, чего не было в D5.
Из приведённого кода создаётся впечатление, что эта строка вообще никогда не выполняется.
> [5] Юрий К (28.01.05 17:22)
> Какую? Чтобы не перепутать.
Project -> Options -> Compiler Messages -> Warnings -> Unsafe type.
← →
Юрий К (2005-01-28 20:32) [7]"> На строке "Text := Items[0]" вылетает, чего не было в D5.
Из приведённого кода создаётся впечатление, что эта строка вообще никогда не выполняется."
А вы попробуйте сначала. Combobox1 на форму и вперёд.
По OnCreate к примеру этот код выполните в D5, а затем в D7.
Добавьте пустую строку в Combobox1.Items, а затем приравняйте к свойству Combobox1.Text Combobox1.Items[0].
← →
Anatoly Podgoretsky © (2005-01-28 21:00) [8]begin...end © (28.01.05 18:16) [6]
Выполняется, а не выполняется только один раз, пока не добавишь хоть одну строчку, а она добавляется в строке 3.
← →
begin...end © (2005-01-28 21:13) [9]> [7] Юрий К (28.01.05 20:32)
Ошибка возникает вообще при обращении к ComboBox.Items[0]. В объекте класса TComboBox поле Items фактически представляет собой экземпляр класса TComboBoxStrings (потомка TCustomComboBoxStrings). Это не обычный TStrings: в частности, там перекрыт метод Get, который вызывается при обращении к Items[...]. Вот текст его реализации (в Delphi 7):function TCustomComboBoxStrings.Get(Index: Integer): string;
var
Len: Integer;
begin
Len := SendMessage(ComboBox.Handle, CB_GETLBTEXTLEN, Index, 0);
if Len <> CB_ERR then
begin
SetLength(Result, Len);
SendMessage(ComboBox.Handle, CB_GETLBTEXT, Index, Longint(PChar(Result)));
end
else
SetLength(Result, 0);
end.
Исключение, о котором идёт речь, возникает именно в выделенной строке. Я ничего не могу предложить, кроме как посмотреть реализацию этого метода (если он там есть) в Delphi 5. Возможно, есть отличия. У меня установленной Delphi 5 сейчас нет.
← →
begin...end © (2005-01-28 21:22) [10]Забыл сказать: класс TCustomComboBoxStrings объявлен там же, где и TComboBox - в модуле StdCtrls (в Delphi 7, по крайней мере).
← →
Юрий К (2005-01-28 21:23) [11]Я же писал выше:
"Если заменить "Items.Add("")" на "Items.Add(" ")", то нормально."
Если добавить пробел вместо пустой строки, всё ОК ведь.
← →
begin...end © (2005-01-28 21:31) [12]> [11] Юрий К (28.01.05 21:23)
Ну и что? Я же говорю: если добавить пустую строку, то исключение возникает в выделенной строке. Если добавить НЕпустую строку, то, действительно, всё нормально. Вам что, трудно выложить здесь реализацию указанного метода в Delphi 5?
← →
begin...end © (2005-01-28 21:44) [13]В приведённом выше (см. [9]) коде в случае пустой строки переменная Len равна нулю. Константа CB_ERR равна -1, поэтому следом выполняются строки SetLength(Result, Len) и SendMessage(ComboBox.Handle, CB_GETLBTEXT, Index, Longint(PChar(Result))), т.е. передаётся строка длиной 0. Думаю, причина ошибки в этом. Но это только моё ИМХО.
← →
Юрий К (2005-01-28 21:46) [14]"function TComboBoxStrings.Get(Index: Integer): string;
var
Text: array[0..4095] of Char;
Len: Integer;
begin
Len := SendMessage(ComboBox.Handle, CB_GETLBTEXT, Index, Longint(@Text));
if Len = CB_ERR then Len := 0;
SetString(Result, Text, Len);
end;"
← →
Юрий К (2005-01-28 21:50) [15]Как различаются коды?
Нужно подправлять, видимо.
← →
begin...end © (2005-01-28 21:56) [16]> [14] Юрий К (28.01.05 21:46)
Предположение [13] подтвердилось.
> [15] Юрий К (28.01.05 21:50)
Не знаю, нужно подправлять или нет, но думаю, что ошибочна проверка условия: if Len <> CB_ERR then. По-видимому, она должна быть такой: if Len > 0 then.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c