Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.033 c
1-1106511411
acc15
2005-01-23 23:16
2005.02.13
Как работать с типизированными файлами


14-1106391471
TUser
2005-01-22 13:57
2005.02.13
Гитара


1-1107087746
rolex
2005-01-30 15:22
2005.02.13
Как получить размер папки?


1-1107158201
ТехникПТО
2005-01-31 10:56
2005.02.13
Real в String


1-1107005282
NeedHElp
2005-01-29 16:28
2005.02.13
Kak zapisat zapis v registri 4tob Ad-Wath nevoznikal??





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский