Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Вниз

Ошибка с ValueListEditor   Найти похожие ветки 

 
nub   (2008-03-12 16:56) [0]

Не понимаю принцип работы компонента ValueListEditor. Проблема в том, что если вставлять инструкцию в CreateForm, то всё срабатывает (см. код) и при нажатии на кнопку добавляется еще 5 строк. Но если список после запуска остался пустым (закомментирована строчка добавления в обработчике CreateForm), то после нажатия на кнопку выдается есключение EAccesViolation. Вот код:

procedure TForm1.Button1Click(Sender: TObject);
begin
for i:=0 to 5 do
begin
 ValueListEditor1.Strings.Add("X=500");
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ValueListEditor1.Strings.Add("X=500"); //это "решающая" строчка
end;


 
Johnmen ©   (2008-03-12 16:58) [1]


>  то всё срабатывает (см. код) и при нажатии на кнопку добавляется
> еще 5 строк.

> for i:=0 to 5 do

Весело "срабатывает" :)


 
sqlmaniac   (2008-03-12 17:12) [2]

ну понимаете ведь что этот код только для демонстрации ошибки, чтобы не углубляться в суть того, над чем я работаю сейчас. Цикл кстати можно вообще убрать будет вот так

procedure TForm1.Button1Click(Sender: TObject);
begin

 ValueListEditor1.Strings.Add("X=500");

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ValueListEditor1.Strings.Add("X=500");
end;


 
Плохиш ©   (2008-03-12 17:14) [3]


> ну понимаете ведь что этот код только для демонстрации ошибки

В приведённом коде синтаксических ошибок нет.


 
Johnmen ©   (2008-03-12 17:17) [4]


> sqlmaniac   (12.03.08 17:12) [2]

Зачем для нас что-то демонстрировать? Чтобы мы в демонстрации искали причину ошибки, возникающей в коде, который мы не видим?
Странно это... Ты не находишь?


 
sqlmaniac   (2008-03-12 17:23) [5]

О том и речь, что в этом коде тоже возникает та же самая ошибка!

ошибка возникает, если закомментировать добавление строки в обработчике FormCreate и оставить только в Button1Click. Тогда при нажатии на кнопку возникает исключение.


 
sqlmaniac   (2008-03-12 17:25) [6]

точно так же если сделать вот так то тоже возникает эта ошибка!


procedure TForm1.Button1Click(Sender: TObject);
begin
 ValueListEditor1.Strings.Clear;
 ValueListEditor1.Strings.Add("X=500");
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ValueListEditor1.Strings.Add("X=500");
end;


 
sniknik ©   (2008-03-12 17:29) [7]

> что в этом коде тоже возникает та же самая ошибка!
нэ возникает! смирно молчит, да.

реальный код смотри.


 
Плохиш ©   (2008-03-12 17:30) [8]


> sqlmaniac   (12.03.08 17:25) [6]

в bds2006 никаких ошибок.


 
Johnmen ©   (2008-03-12 17:31) [9]

Пока не будет реального кода, связанного с ValueListEditor1, говорить бессмысленно. Ибо, как уже сказали, здесь ошибок нет.


 
sniknik ©   (2008-03-12 17:33) [10]

> точно так же если сделать вот так
вот так и сделай, сам... чистый проект, пустая форма, на нее ложишь ValueListEditor, и кнопку/создание формы со своим (показанным здесь!!!)  кодом... и?


 
sniknik ©   (2008-03-12 17:36) [11]

и кстати ошибку не игнорируй, а переведи... помогает. не всем правда, но помогает.


 
sqlmaniac   (2008-03-12 17:43) [12]

Так и сделал сам так! Иначе бы не говорил!

Пустой проект, на форме два компонента - ValueListEditor и кнопка. Вот полный код модуля


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, ValEdit, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ValueListEditor1: TValueListEditor;
   procedure Button1Click(Sender: TObject);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 i: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

 ValueListEditor1.Strings.Add("X=500");
end;

end.


Даже скриншот сделал...
http://ipicture.ru/uploads/080312/HgAC5scoQu.jpg


 
Johnmen ©   (2008-03-12 17:52) [13]


> sqlmaniac   (12.03.08 17:43) [12]

ЗДЕСЬ ОШИБОК НЕТ!
Нам остается подключить блок интуиции и телепатии...:))


 
sqlmaniac   (2008-03-12 17:55) [14]

может настройки среды какие-нибудь или настройка компонента? Я почти сутки уже бьюсь над этой проблемой. Код привел полностью. Всё перед вами


 
sqlmaniac   (2008-03-12 17:58) [15]

только что обнаружил еще одну закономерность!

Если во время выполнения программы перед тем, как нажать на кнопку, ввести что-нибудь в колонку Value, то после нажатия "X 500" добавляется во вторую строчку..


 
sniknik ©   (2008-03-12 18:01) [16]

в опциях проекта поставь галочку на "Use Debug DCUs", перекомпили, поставь точку останова на ValueListEditor1.Strings.Add("X=500");, запусти, нажми кнопку, после при приостановленном выполнении иди в меню, ищи Find Error, нажми и вводи цифры 00464640 (догадайся откуда), в принципе должен попасть на место где глюк... ктото правил генофонд...
приведи это место. сравним. (вернее не само место, а что там используется - несозданный обьект)


 
Плохиш ©   (2008-03-12 18:04) [17]


> Если во время выполнения программы перед тем, как нажать
> на кнопку, ввести что-нибудь в колонку Value, то после нажатия
> "X 500" добавляется во вторую строчку

Не хотел бы я услышать куда она добавляется в другом случае...


 
sqlmaniac   (2008-03-12 18:14) [18]

Данная последовательность действий выкинула меня в source\vcl\forms.pas в эту функцию на строчку, выделенную жирным шрифтом


function MultiLineWidth(const Value: string): Integer;
 var
   W: Integer;
   P, Start: PChar;
   S: string;
 begin
   Result := 0;
   P := Pointer(Value);
   if P <> nil then
     while P^ <> #0 do
     begin
       Start := P;
       while not (P^ in [ #0, #10, #13]) do
         P := StrNextChar(P);
       SetString(S, Start, P - Start);
       W := FHintWindow.Canvas.TextWidth(S);
       if W > Result then
         Result := W;
       if P^ = #13 then Inc(P);
       if P^ = #10 then Inc(P);
     end;
 end;


 
sqlmaniac   (2008-03-12 18:59) [19]

поставил дельфи из другого дистрибутива. изменений нет..


 
Жуков Олег   (2008-03-12 20:03) [20]

Да, есть такая ошибка, D7 Vista

обновления инплейсэдитора запускается из перекрытого Changed, который запускается из TStringList.InsertItem, при этом идет обращение к какому-то   FItemProps[Index],  который добавляется уже позже, в перекрытом  TValueListStrings.InsertItem после inherited, отсюда и AV


 
Servy   (2008-03-12 20:33) [21]

Писал здесь о такой же ошибке с год назад. В версиях выше D7 она исправлена, в D7 можно либо добавлять строки другим способом, либо обрамлять добавление строк в BeginUpdate; EndUpdate.


 
VirEx ©   (2008-03-12 20:40) [22]

Эх вы, а еще мастерами называетесь :D


 
sqlmaniac   (2008-03-12 21:29) [23]

спасибо :) нашел роцедуру InsertRow. Добавляю через неё ;)


 
Johnmen ©   (2008-03-12 21:34) [24]


> Жуков Олег   (12.03.08 20:03) [20]

У автора XP, если ты вдруг не заметил.

> Servy   (12.03.08 20:33) [21]

Вот странное дело, у меня D7, а ошибки нет. М.б. именно у меня что-то не так?


 
Servy   (2008-03-12 22:22) [25]

> Вот странное дело, у меня D7, а ошибки нет. М.б. именно
> у меня что-то не так?


Возможно как раз у Вас всё так - стоят сервис-паки или обновления, исправляющие данную ошибку. У меня D7 без обновлений, и регулярно падает с AV на коде из [12]. Насколько я помню, когда я разбирался с этой проблемой, она имела место на D6 тоже, проверьте, если у вас есть такая древность. В BDS2006 и Delphi2007 такого неожиданного поведения уже не наблюдается.


 
Плохиш ©   (2008-03-12 22:24) [26]

D7+XP - ошибок нет. Следовательно вывод: Некоторым стоит сменит вернуться к выполнению основных обязанностий.


 
sniknik ©   (2008-03-12 22:38) [27]

тоже нет ошибки (D7,XP), более того нашел типа указания на проблемное место
http://rsdn.ru/Forum/message/479284.1.aspx
так вот, оно у меня точно такое же... до последней буквы... а ошибки нет. значит баг в другом месте.

> У меня D7 без обновлений, и регулярно падает с AV на коде из [12].
шли исходный модуль ValEdit-а, попробую твой.


 
Servy   (2008-03-12 23:31) [28]

По просьбе выкладываю готовый падающий образец - тестовая программа + модуль ValEdit.pas от моей 7й делфи. Успешно компилируется и падает также под D2007 и D7, под остальными не проверял. 260 Кб.

http://webfile.ru/1799514


> D7+XP - ошибок нет. Следовательно вывод: Некоторым стоит
> сменит вернуться к выполнению основных обязанностий.


Ознакомься с архивом по ссылке и пересмотри свое мнение. Если у тебя все расчудесно, это не значит, что все кто наблюдает ошибку паталогически криворуки.


 
Servy ©   (2008-03-12 23:34) [29]

Прошу прощения, опечатка, 206 Кб :).


 
Плохиш ©   (2008-03-13 00:06) [30]


> Servy   (12.03.08 23:31) [28]

Борланд выпускает обновления, надо думать, просто так от нечего делать

function TValueListStrings.FindItemProp(const KeyOrIndex: Variant;
 Create: Boolean = False): TItemProp;
var
 Index: Integer;
begin
//  if Count > 0 then
 if (Count > 0) and Assigned(FItemProps) then
 begin
   if VarIsOrdinal(KeyOrIndex) then
     Index := KeyOrIndex
   else
   begin
     Index := IndexOfName(KeyOrIndex);
     if Create and (Index = -1) then
       raise Exception.CreateResFmt(@SKeyNotFound, [KeyOrIndex]);
   end;
   Result := FItemProps[Index];
   if Create and not Assigned(Result) then
   begin
     Result := TItemProp.Create(FEditor);
     FItemProps[Index] := Result;
   end;
 end
 else
   Result := nil;
end;


 
sniknik ©   (2008-03-13 00:15) [31]

обновляйтесь господа... не просто так апдейты выкладывают
различие сдесь (а не что в ссылке упоминалось или в [20])
старый модуль
function TValueListStrings.FindItemProp(const KeyOrIndex: Variant;
 Create: Boolean = False): TItemProp;
var
 Index: Integer;
begin
 if Count > 0 then
 begin
   if VarIsOrdinal(KeyOrIndex) then
     Index := KeyOrIndex
   else
   begin
     Index := IndexOfName(KeyOrIndex);
     if Create and (Index = -1) then
       raise Exception.CreateResFmt(@SKeyNotFound, [KeyOrIndex]);
   end;
   Result := FItemProps[Index]; //глюк
   if Create and not Assigned(Result) then
   begin
     Result := TItemProp.Create(FEditor);
     FItemProps[Index] := Result;
   end;
 end
 else
   Result := nil;
end;


новый (из D7, следующие "еще новее")
function TValueListStrings.FindItemProp(const KeyOrIndex: Variant;
 Create: Boolean = False): TItemProp;
var
 Index: Integer;
begin
 if (Count > 0) and Assigned(FItemProps) then //очевидное изменение
 begin
   if VarIsOrdinal(KeyOrIndex) then
     Index := KeyOrIndex
   else
   begin
     Index := IndexOfName(KeyOrIndex);
     if Create and (Index = -1) then
       raise Exception.CreateResFmt(@SKeyNotFound, [KeyOrIndex]);
   end;
   Result := FItemProps[Index]; //глюка нет
   if Create and not Assigned(Result) then
   begin
     Result := TItemProp.Create(FEditor);
     FItemProps[Index] := Result;
   end;
 end
 else
   Result := nil;
end;


 
sniknik ©   (2008-03-13 00:16) [32]

упс. опоздал.


 
Servy ©   (2008-03-13 00:18) [33]

> [30]


О том, что Борланд выпускает обновления мне известно, о чем упомянуто еще в [25], о том, что ошибка была локализована и исправлена Борландом, и следующие версии ее не содержат я тоже в курсе, см. [21]. Так что ничего нового вы мне не сообщили.

Обновления установлены не у всех, у автора сабжа по всей видимости такое обновление как раз отсутствует, что привело к упомянутой ошибке и появлению топика. А ваш пассаж в посте [26] меня задел; как легко вы отправили всех подметать полы, только на основании того, что у Вас все работает, не пожелав даже разобраться в причинах.


 
sniknik ©   (2008-03-13 00:26) [34]

кстати во всем модуле это единственное изменение (+ 27 байт), если конечно нет еще таких которые "баш на баш" в количестве букв.


 
Плохиш ©   (2008-03-13 00:33) [35]


> как легко вы отправили всех подметать полы, только на основании
> того, что у Вас все работает, не пожелав даже разобраться
> в причинах.

Т.е. я должен был за тебя на основании сказок разбираться в твоих проблемах? Нет уж идите-ка вы, вместе с автором, полы мести...


 
Servy ©   (2008-03-13 01:09) [36]

> [35]


Вы не правы. Не на основании сказок, а на основании факта - ошибка в VCL была, она была исправлена, но в старых версиях она осталась; был приведен конкретный пример, еще в [12]. Отрицать наличие ошибки, по-моему, глупо. Лично вас никто "разбираться", тем более в моих проблемах, не заставлял, слово "должен" в вашем посте надумано. Вы сами зашли в "Начинающим", и сами решили ответить в этой ветке, однако сказать ничего умнее "а у меня работает, значит все, у кого не работает - дураки" вы не смогли, на что я вам справедливо и указал. На нежелание видеть дальше собственного носа и чванство.

Если у вас еще есть что сказать мне лично - добро пожаловать в icq.


 
Германн ©   (2008-03-13 01:29) [37]


> Servy ©   (13.03.08 01:09) [36]
>
> > [35]
>
>
> Вы не правы. Не на основании сказок, а на основании факта
> - ошибка в VCL была, она была исправлена...

Это ли не основание послать? Любые версии Дельфи (вообще любые программные продукты) нужно всегда использовать со всеми, на сегодняшний день, имеющимися апдейтами и сервиспаками! И только в этом случае можно надеятся на реальную помощь при запросе на форуме. Такое правило сродни ежедневной чистке зубов или мытья рук перед едой. Должно делаться автоматически и без раздумий насчет надобности или насчет "завтра сделаю".


 
Servy ©   (2008-03-13 01:51) [38]

> нужно всегда использовать со всеми, на сегодняшний день,
> имеющимися апдейтами и сервиспаками!


Действительно, то есть я должен был пойти и, угрожая противоестесственными действиями раскаленной кочергой, заставить админа компьютерного класса университета, в котором мне посчастливилось учиться, снести к чертям 6е русифицированные (страшное зрелище) делфи, которые он туда на кой-то хрен поставил? Причем, не откладывая это на "завтра сделаю"? (=

Да, то что вы пишете правильно, и у себя дома, где я сам себе хозяин, я так и поступаю, и живу себе спокойно. Но случается по-разному, может были у автора сабжа причины использовать 7ю делфи, без всех существующих обновлений. А Плохиш ему сразу метлу вручил, и указал направление на выход. Не хорошо это, как по мне.


 
Германн ©   (2008-03-13 03:01) [39]


> Servy ©   (13.03.08 01:51) [38]
>
> > нужно всегда использовать со всеми, на сегодняшний день,
>
> > имеющимися апдейтами и сервиспаками!
>
>
> Действительно, то есть я должен был пойти и, угрожая противоестесственными
> действиями раскаленной кочергой, заставить админа компьютерного
> класса университета, в котором мне посчастливилось учиться,
>  снести к чертям 6е русифицированные (страшное зрелище)
> делфи, которые он туда на кой-то хрен поставил? Причем,
> не откладывая это на "завтра сделаю"? (=
>
> Да, то что вы пишете правильно, и у себя дома, где я сам
> себе хозяин, я так и поступаю, и живу себе спокойно. Но
> случается по-разному, может были у автора сабжа причины
> использовать 7ю делфи, без всех существующих обновлений.
>  А Плохиш ему сразу метлу вручил, и указал направление на
> выход. Не хорошо это, как по мне.
>

Мне что. Ещё раз повторить?


 
Жуков Олег   (2008-03-13 08:49) [40]

Это полезный баг, учит пользоваться BeginUpdate/EndUpdate. Кто правильно пишет на него не наткнется.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.008 c
15-1203855301
keymaster
2008-02-24 15:15
2008.04.06
Проблема с запуском Turbo Delphi под Vista


15-1203934641
Kerk
2008-02-25 13:17
2008.04.06
Посоветуйте хороший сниффер


15-1203580855
Ega23
2008-02-21 11:00
2008.04.06
А Delphi для PHP кто-нибудь уже использовал?


2-1205390476
prorock
2008-03-13 09:41
2008.04.06
Ошибка при выходе с приложения


3-1194865899
Den
2007-11-12 14:11
2008.04.06
управление БД из dll





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский