Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

В 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.035 c
14-1106670254
Шишкин Илья
2005-01-25 19:24
2005.02.13
КПК в Москве


1-1107079622
ShimON
2005-01-30 13:07
2005.02.13
MediaPlayer и потоки


1-1106881630
gsformat
2005-01-28 06:07
2005.02.13
как отловить утечку памяти


4-1104133749
Andrej
2004-12-27 10:49
2005.02.13
Как перетащить файл на форму


1-1106744363
Raider
2005-01-26 15:59
2005.02.13
Исходник звонилки