Использование в программе 2-ух OnPaint в разных формах

Вопросы использования сторонних (не входящих в состав FPC и Lazarus) утилит и библиотек.

Модератор: Модераторы

Использование в программе 2-ух OnPaint в разных формах

Сообщение *13* » 08.01.2008 02:40:59

Друзья, помогите кто может, я уже задолбался искать в чем подвох.
Я пишу программу - иллюстратор алгоритма по дискретной математике (Дерево связного графа), в чем суть проги- не так уж и важно.
Есть форма, на ней прога через Канвас рисует сам граф.
Граф вот таким вот образом записывается в прогу
Код: Выделить всё
Type Toch=record
name:string[1];
x:0..400;
y:0..400;
end;
Type Lin=record
ves:string[3];
lbegin:string[1];
lend:string[1];
end;
......
  Tochki: array of toch;
  Lines: array of Lin;

Изображение

Затем, когда я нажимаю в менюшке выполнить сам алгоритм , котрывается другая форма, и там уже отображается измененный граф.
Свои массивы я не трогаю, я переливаю их в идентичные по тайпу, но другие!
Код: Выделить всё
AlgTochki: array of toch;
AlgLines : array of Lin;


Изображение

После этого- что весьма интересно, не СРАЖУ же, а спустя 10-20 секунд, на основной форме СЛЕТАЕТ график! либо отображается какойто бред, либо не отображается ничего вообще. Затем когда я пытаюсь создать новый график или же загрузить сохраненный ( при этом существующие массивы записей полностью стираются), прога всё равно не хочет их отображать! Вообще парадокс, по крайней мере для меня.
И для основной формы, и для второй, где отображается алгоритм- массивы записей обьявлены в основном юните. В юните со второй формой я сделал лишь свой OnPaint, второй, чтобы он отображал измененный график. И отображает, абсолютно не глючит.
При переливании с одного массива на другой- я абсолютно не изменяю основной! я с него просто читаю, не в коем случае не редактирую.
Как он может вообще слетать, и почему?
Вот мой OnPaint, если это чемто поможет:
Код: Выделить всё
procedure TForm1.FormPaint(Sender: TObject);
var i1,iii1:byte;
x1,x2,y1,y2:integer;
begin
Canvas.Pen.Width:=2;
Canvas.Pen.Color :=
       RGB(255,1,1);
for iii1:=0 to Length(Lines)-1 do begin
for i1:=0 to Length(Tochki)-1 do begin
if Lines[iii1].lbegin=Tochki[i1].name then begin
x1:=Tochki[i1].x;
y1:=Tochki[i1].y;
end;
if Lines[iii1].lend=Tochki[i1].name then begin
x2:=Tochki[i1].x;
y2:=Tochki[i1].y;
end;
end;
Canvas.MoveTo(x1+8, y1+8);
Canvas.LineTo(x2+8, y2+8);
end;
Canvas.Pen.Width:=2;
    Canvas.Brush.Color :=
       RGB(1,1,255);
Canvas.Pen.Color :=
       RGB(1,1,255);
for i1:=0 to Length(Tochki)-1 do  begin
Canvas.Ellipse((Tochki[i1].x+4),(Tochki[i1].y+4),(Tochki[i1].x+12),(Tochki[i1].y+12));
SetBkMode(Canvas.Handle, TRANSPARENT);
Canvas.textout((Tochki[i1].x-4), (Tochki[i1].y-4), (Tochki[i1].name));
end;

end;

во второй форме он идентичен, только названия массивов сменил.

Я заранее очень благодарен за любую вашу помощь!
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение FedeX » 08.01.2008 11:17:07

Наверно где-то течёт память и что-то где-то перезаписывает :roll: Тут тебе только дебагер поможет.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение serg_iv » 08.01.2008 11:36:15

Возможно при операциях с массивами, происходит выход за пределы диапазона?
Я когда то очень долго искал глюк в программе, грешил на сырость Лазаруса, оказалось сам дурак, вылезал за пределы одного из массивов. А ошибка проявлялась совсем в другом месте.
serg_iv
постоялец
 
Сообщения: 276
Зарегистрирован: 15.10.2005 18:45:46
Откуда: Миасс

Сообщение *13* » 08.01.2008 13:10:35

Спасибо за аргументы. :idea:

Но понимаете в чём дело...
Когда я жму выполнить алгоритм, я же говорю, происходит только ЧТЕНИЕ из массива, который при этом еще и на основной форме отображается, и запись в другой. Как может быть выход за предел массива, если до алгоритма OnPaint вполне себе отображал всё что нужно? И который потом слетает, или не слетает - не знаю что с ним происходит, но массив приходит в негодность, даже если его стереть ( SetLength(Tochki,0); SetLength(Lines,0) ) и перезаписать заново. У меня тоже впечатление как у Серга, только что я нашел баг в делфи :shock:

Что же делать =\
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение FedeX » 08.01.2008 13:16:34

Можно глянуть на процедурку копирования из одного массива в другой?
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение *13* » 08.01.2008 13:37:02

Да.
Т.к. граф на выходе в другой форме изменяется ( а именно теряет некоторые ребра) , то это не совсем копирование, а как бы фильтрование, или не знаю как сказать :)

Код: Выделить всё
procedure TForm1.N911Click(Sender: TObject);
var i2,j,i1,check:byte;
yes:boolean;
begin
for i2:=0 to Length(Tochki)-1 do  begin
SetLength(AlgTochki,i2+1);
AlgTochki[i2].name:=Tochki[i2].name;
AlgTochki[i2].x:=Tochki[i2].x;
AlgTochki[i2].y:=Tochki[i2].y;
end;

i1:=0;
i2:=0;
while i2 <= Length(Tochki)-1 do begin
yes:=false;
for j:=1 to Length(Lines)-1 do
  if ((Lines[j].lbegin=AlgTochki[i2].name) AND (Lines[j].lend=AlgTochki[i2+1].name))
  OR ((Lines[j].lbegin=AlgTochki[i2+1].name) AND (Lines[j].lend=AlgTochki[i2].name))
  then begin
    SetLength(AlgLines,i1+1);
    AlgLines[i1].ves:=Lines[j].ves;
    AlgLines[i1].lbegin:=Lines[j].lbegin;
    AlgLines[i1].lend:=Lines[j].lend;
    i1:=i1+1;
    yes:=true;
    break;
  end;
if (yes=false) then begin
for j:=1 to Length(Lines)-1 do
  if ((Lines[j].lbegin=AlgTochki[i2+1].name) OR (Lines[j].lend=AlgTochki[i2+1].name)) then begin
    SetLength(AlgLines,i1+1);
    AlgLines[i1].ves:=Lines[j].ves;
    AlgLines[i1].lbegin:=Lines[j].lbegin;
    AlgLines[i1].lend:=Lines[j].lend;
    i1:=i1+1;
    break;
  end;
end;
i2:=i2+1;
end;

form3.visible:=true
end;
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57

Сообщение FedeX » 09.01.2008 12:15:29

Не, всё-равно сложно сказать. Токо дебугер.
Только могу посоветовать выделять память под элементы массивов не в цикле по одному элементу, а сразу всю перед циклом. И вещи вроде string[1] заменить на char. А string[3] вроде вообще можно каким-нить перечислимым типом заменить... Может поможет :wink:
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение *13* » 09.01.2008 20:39:30

мда.... я занёс начальное задание длины массива "1" в form activate, вместо form create. В результате, как только я отключался \ переключался снова на основную форму, весь массив слетал до размера 1.
И вот из за этих 2 вонючих строк в не тех events я парил себе мозг 2 дня. Класс.
На ошибках учатся.....
*13*
новенький
 
Сообщения: 28
Зарегистрирован: 14.12.2006 16:29:57


Вернуться в Сторонние средства

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru