Текущий архив: 2008.04.06;
Скачать: CL | DM;
Вниз
Ошибка с 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;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.006 c