Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];
Внизaccess violation и Abstract error для чайников Найти похожие ветки
← →
Maestro (2004-06-02 08:39) [0]Всем привет.
пишу прогу для кафе:
на сенсорном экране динамически созданые панели изображающие столики нажимаешь на столик попадаешь в меню "категорий блюд"
и делее нажав на категорию попадаешь в "список блюдей"
панели с названиями категорий блюд и панели с самими блюдами
тоже создаются динамически так как все это меню лежит в базе и может ежедневно меняться
теперь трабла
при нажатии на "стол" выполняется процедура выборки категорий блюд из базы и согласно их количеству в два ряда создает разноцветные панели с названием категории блюда
процедура выполняется без проблем НО ПРИ ВЫХОДЕ ИЗ НЕЕ
(в пошаговом режиме курсор стоит на последнем End; в процедуре)
нажимешь F8 и получаешь Access violation а в ряде случаев
просто Abstract error (я не смог отследить в каких похоже в случайных)
помогите кто может!!
Уже все глаза сломал криминала никакого не вижу...
причем все очень страно иногда процедура срабатывает без ошибки
З.Ы. прога писалась сначала в delphi 6 потом я ее в семерку перетащил но ошибку выдает и втой версии и в другой
← →
Кщд © (2004-06-02 09:05) [1]либо код процедуры, либо ваше меню не нравится системе.
у вас какая?
у меня - 2000 Prof - жрет всё.
как свинья.
← →
Maestro (2004-06-02 09:31) [2]кажется я понял
я видимо я коряво удаляю компоненты
for i:=ComponentCount-1 downto 0 do
if components[i] is Tpanel and (pos("PanelName_kat",TPanel(components[i]).name)<>0)then
TPanel(components[i]).free;
компоненты прекрасно удаляются
но заремил этот код ошибка появляться перестала
ну и естественно панели перестали удаляться
может кто подскажет более правильный способ удаления компонентов
← →
Rutven © (2004-06-02 10:13) [3]Перед удалением компонента, отцепи его от родителя (Parent := nil)
← →
ZHK © (2004-06-02 10:14) [4]А RemoveComponent тоже не помогает?
← →
pasha_golub © (2004-06-02 10:15) [5]Вопрос еще более глубокий. На кой хрен плодить кучу компонентов?
← →
Maestro (2004-06-02 13:28) [6]нет парни не помогает
ошибка вываливается в случайный момент(т.е. может вывалиться а может нет 50 на 50)
после отработки процедуры OnClick динамически созданной панели
причем если циклы удаления компонентов поставить до создания новых то ошибку выдает всегда а если после, как в данных примерах, то 50 на 50 работает
привожу код:
private
procedure StolPanelClicked(Sender: TObject);
procedure PanelNameKatClicked(Sender: TObject);
{ Private declarations }
public
procedure CreatePanelName_kat(Name_b,cap_b:String;m_top,m_left,clr:Integer);
procedure CreateStolPanel(Name_b,cap_b:String;m_top,m_left,m_size:Integer);
{ Public declarations }
end;
1. Создание стола
procedure TForm1.CreateStolPanel;
var pnl:TPanel;
begin
pnl := TPanel.Create(Form1);
with pnl do begin
Parent := Self;
OnClick := StolPanelClicked;
name:=Name_b;
top:=m_top;
Left:=m_left;
Width:=m_size;
Height:=m_size;
Cursor:=crHandPoint;
Font.size:=14;
Font.Style:=[fsBold];
Caption:=cap_b;
Visible := true;
End;
end;
procedure TForm1.StolPanelClicked;
var pnl:TPanel;
i,k,l:Integer;
begin
With Query1 do begin
Active:=False;
SQL.Clear;
SQL.Add("select name_kat,color from ""+Path_DBF+"spr_menu.dbf" group by name_kat,color order By Name_kat");
Active:=True;
i:=Panel4.top+20;
l:=Panel4.Left+20;
while not eof do begin
CreatePanelName_kat("PanelName_kat"+IntToStr(RecNo),FieldByname("name_Kat").AsString,i,l,FieldByname("color").AsInteger) ;
i:=i+50;
if Recno=8 Then begin
l:=l+300;
i:=Panel4.top+20;
end;
Next;
end;
End;
level:=1;
end;{вот здесь показывает ошибку}
2. создание меню категорий блюд
procedure TForm1.CreatePanelName_kat;
var pnl : TPanel;
lbl : TLabel;
Begin
pnl := TPanel.Create(Form1);
with pnl do begin
Parent := Self;
OnClick := PanelNameKatClicked;
Caption:=cap_b;
name:=Name_b;
top:=m_top;
Left:=m_left;
Width:=200;
Height:=40;
Cursor:=crHandPoint;
Color:=clr;
Caption:=cap_b;
Visible := true;
End;
end;
procedure TForm1.PanelNameKatClicked;
var pnl:TPanel;
m_name_kat:String;
i,k1,k2,l,kv,kg:Integer;
begin
level:=2;
m_name_kat:=TPanel(Sender).Caption;
With Query1 do begin
Active:=False;
SQL.Clear;
SQL.Add("select * from ""+Path_DBF+"spr_menu.dbf" where name_kat=""+m_name_kat+"" order By Name_blud");
Active:=True;
Kg:=4;
kv:= (RecordCount div 3)+1;
First;
i:=Panel4.Top+10;l:=Panel4.Left+10;
k1:=0;
k2:=0;
While not Query1.Eof do begin
CreateButton("m_butt"+IntToStr(k1)+IntToStr(k2),FieldByName("name_blud").AsString,i,l,FieldByName("Color").AsInteger);
k1:=k1+1;
l:=l+160;
if k1=kg Then begin
i:=i+50;
l:=Panel4.Left+10;
k1:=0;
k2:=k2+1;
End;
Query1.Next;
End;
End;
for i:=ComponentCount-1 downto 0 do
if components[i] is Tpanel and (pos("PanelName_kat",TPanel(components[i]).name)<>0)then begin
TPanel(components[i]).Parent:=nil;
TPanel(components[i]).free;
end;
end;
← →
Anatoly Podgoretsky © (2004-06-02 13:36) [7]Криминала два
1. неверные указатели
2. обращение к абстрактным методам
код приведен большой, но недостаточное количества данных для анализа, еще большее количество терра инкогнито осталось во вне.
← →
Maestro (2004-06-02 13:41) [8]где неверные указатели?
и какие методы являются абстрактными?
не забывайте я чайник :-))
← →
Anatoly Podgoretsky © (2004-06-02 15:09) [9]pnl, Name_b, m_top, m_left, m_size, cap_b, Query1, Panel4, clr, m_name_kat,
Вот для начало список по которуму нет ясности, что это и в каком состоянии. Плюс добавим то что здесь не приведено.
← →
jack128 © (2004-06-02 15:12) [10]
> а в ряде случаев
> просто Abstract error
варнинги за надобностью отключаем, я так понимаю?? Включи обратно и увидешь где ошибка..
← →
MetalFan © (2004-06-02 15:13) [11]
> for i:=ComponentCount-1 downto 0 do
> if components[i] is Tpanel and (pos("PanelName_kat",TPanel(components[i]).name)<>0)then
> begin
> TPanel(components[i]).Parent:=nil;
> TPanel(components[i]).free;
> end;
как то мне не нравится, что в обработчике клика по панели она может и убиться...
← →
pasha_golub © (2004-06-02 15:21) [12]Повторюсь, по моему скромному мнению, создание тучи компонентов здесь ваапще не нужно. Вывод: переписать все нафиг.
← →
Maestro (2004-06-02 15:31) [13]для pasha_golub
каким образом тогда отображать на экране нужное меню
если количество категорий и блюд в меню на день ежедневно меняется?
MetalFan
может и в этом проблема что панель сама себя убивает
(хотя я так не думаю)
моет сделать чтобы при нажатии нужная панель подсвечивалась
а кнопка далее перелистывала страницу
щас попробуем
← →
jack128 © (2004-06-02 17:42) [14]
> каким образом тогда отображать на экране нужное меню
> если количество категорий и блюд в меню на день ежедневно
> меняется?
Один DbGrid
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.03 c