Форум: "Основная";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
ВнизРазное исполенение кода при дебаге и при простом запуске Найти похожие ветки
← →
lockheed_man © (2006-11-09 16:47) [0]Ув. Мастера, есть такой код
if GazetaOpened{булева функция} then
begin
CloseTabs;//процедура
for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do CreateTab(i,PageNumbers[i])
end
else for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do CreateTab(i,PageNumbers[i]);
Когда исполняю его по F8, то все выполняется правиль, когда просто запускаю по F9, то независимо от того, выполняется услови или нет, исполняется код записанный перед Else. От чего это может зависеть? Заранее спасибо.
← →
Сергей М. © (2006-11-09 16:48) [1]
> От чего это может зависеть?
От времени, разумеется ...От чего же еще ?
← →
Dmitrij_K (2006-11-09 16:48) [2]в 99,9% это ошибка в программе
← →
Ketmar © (2006-11-09 16:50) [3]сильно подозреваю, что это зависит от ошибки в программе.
зыж маленький совет: можно для наглядности булевы функции вызывать какGazetaOpened()
. ещё такие функции лучше начинать с "Is".
← →
lockheed_man © (2006-11-09 16:55) [4]
> От времени, разумеется ...От чего же еще ?
>
Извини, не понял. Можно по-популярнее?
← →
lockheed_man © (2006-11-09 17:01) [5]Глобальная переменна объявлена как GazetaOpened: Boolean = False;
Первый раз используется именно в этом куске кода и только потом изменяется. Т.е. прямо после запуска программы должен был выполняться else, что и происходит при пошаговом исполнении, а при простом прогоне проги выполняется только
begin
CloseTabs;
for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do CreateTab(i,PageNumbers[i])
end
Уже несколько раз прошел по коду. Ума не приложу в чем причина.
← →
Сергей М. © (2006-11-09 17:04) [6]
> не понял
Да что тут понимать-то ?)
При F8 ф-ция GazetaOpened() выполняется, скажем, 2 сек (с учетом неявных действий дубового дельфийскогоотладчика), а при F9 она же выполняется, скажем, 1 сек. ... А внутренняя логика этой ф-ции при этом немало зависит от тех самых времен ...
Еще страшней предположение, что внутри ф-ции анализируется признакт работы процесса под отладчиком)
← →
Ketmar © (2006-11-09 17:04) [7]опа. функция волшебным образом превратилась в переменную. какие ещё открытия нас ждут?
← →
Сергей М. © (2006-11-09 17:06) [8]
> Глобальная переменна объявлена как GazetaOpened: Boolean
> = False;
Ну и какая нафих тогда
> {булева функция}
если это просто переменная ?
И доп.потоки, надеюсь, тут ни при чем ?
← →
lockheed_man © (2006-11-09 17:08) [9]
> Ну и какая нафих тогда
Упс, сорри. Это простая будевая переменная. Никаких доп. потоков нет.
← →
ANB © (2006-11-09 17:15) [10]Упал под стул :))))))
Орех !!!
← →
lockheed_man © (2006-11-09 17:27) [11]
> Упал под стул :))))))
>
> Орех !!!
>
Может все таки посоветуете чего,плз? Над своими ошибками сам посмеюсь с огромным удовольствием, только найти бы да решить.
← →
Германн © (2006-11-09 17:35) [12]
> lockheed_man © (09.11.06 17:27) [11]
>
>
> > Упал под стул :))))))
> >
> > Орех !!!
> >
>
> Может все таки посоветуете чего,плз?
Тогда объясни в результате чего переменной GazetaOpened присваивается то или иное значение?
← →
lockheed_man © (2006-11-09 17:41) [13]
> Тогда объясни в результате чего переменной GazetaOpened
> присваивается то или иное значение?
При запуске проги GazetaOpened = False и не меняется нигде до проверки, в которой проявляется проблема. Уже просмотрел каждую строку кода до которая выполняется до проверки условия. Значение сохраняется False, но увы. Вот.
← →
Ketmar © (2006-11-09 17:52) [14]после [7] я подозреваю, что новым открытием таки будет поток или неучтённый обработчик какого-то события.
← →
Германн © (2006-11-09 17:55) [15]
> При запуске проги GazetaOpened = False и не меняется нигде
> до проверки
Темнишь. Где-то она всё же должна измениться.
← →
lockheed_man © (2006-11-09 20:21) [16]Как говорится: "Код в студию"
...
var
MainForm: TMainForm;
CurrentUser: String = "VoVa";
isAdmin: Boolean = True;
IsGazetaOpened: Boolean = False;
GazetaNumber: Word;
ColorPages: array of TColorPage;
PageNumbers: array of Byte;
implementation
uses ULogin, UUsers, UGazetaNumber;
{$R *.dfm}
procedure TMainForm.AddEditBlockBtnClick(Sender: TObject);
var
newBlock: TBlock;
vContainer: TWinControl;
begin
if not IsGazetaOpened then
begin
ShowMessage("Невозможно добавить блок."+#13+#10+"Не открыта ни одна страница");
Exit;
end;
//prepare block
newBlock := TBlock.Create;
with newBlock do
begin
SetAgent(CurrentUser);
SetFirma(FirmaEdit.Text);
SetPhone(PhoneEdit.Text);
SetPrepaied(PrepaiedEdit.Text);
case BlockSize.ItemIndex of
0: SetBlockSize(30);
1: SetBlockSize(60);
2: SetBlockSize(90);
3: SetBlockSize(120);
end;
case Orientation.ItemIndex of
0: SetOrientation(1); //horizontal
1: SetOrientation(0); //vertical
end;
SetText(BlockText.Text);
SetPageNumber(PageNumbers[PageControl.ActivePageIndex]);
end;
with ColorPages[PageControl.ActivePageIndex] do
begin
AddBlock(newBlock);
DrawBlock(newBlock);
end;
end;
procedure TMainForm.CloseTabs;
var
i: Byte;
begin
for i := 0 to PageControl.PageCount - 1 do
begin
PageControl.ActivePage.Free;
//ColorPages[i].Free;
end;
IsGazetaOpened := False;
end;
procedure TMainForm.CreateTab(TabNumber, PageNumber: Byte);
var
vSheet: TTabSheet;
begin
{create page tab}
vSheet := TTabSheet.Create(Self);
with vSheet do
begin
PageControl := MainForm.PageControl;
PageIndex := TabNumber;
Caption := "Страница " + IntToStr(PageNumber);
Show;
end;
ColorPages[TabNumber] := TColorPage.Create(PageNumber, GetBlocksQuery.RecordCount, vSheet);
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
GetBlocksQuery.Close;
GetGazetaQuery.Close;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
if isAdmin then mAdmin.Enabled := True;
StatusBar.Panels[1].Text := "Пользователь: " + UpperCase(CurrentUser);
end;
procedure TMainForm.GetPageNumbers(Pages: String);
var
strLength: Byte;
i, j: Byte;
strPage: String;
begin
strLength := Length(Pages);
strPage := "";
j := 0;
SetLength(PageNumbers, GetGazetaQueryG_PAGECOUNT.Value);
for i := 1 to strLength + 1 do
begin
if (Pages[i] <> ",") and (Pages[i] <> #0) then strPage := strPage + Pages[i]
else begin
PageNumbers[j] := StrToInt(strPage);
Inc(j);
strPage := "";
end;
end;
end;
procedure TMainForm.ToolButton2Click(Sender: TObject);//первое действие после запуска
var
i: Byte;
begin
with GetGazetaQuery do
begin
ParamByName("G_NUMBER").Value := 1;
Open;
end;
GetPageNumbers(GetGazetaQueryG_PAGENUMBERS.Value);
SetLength(ColorPages,GetGazetaQueryG_PAGECOUNT.Value);
with GetBlocksQuery do
begin
ParamByName("G_ID").Value := GetGazetaQueryG_ID.Value;
Open;
end;
if IsGazetaOpened then CloseTabs;
for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do CreateTab(i,PageNumbers[i]);
IsGazetaOpened := True;
end;
← →
Германн © (2006-11-10 00:13) [17]Дал новый код, давай теперь новый вопрос.
← →
lockheed_man © (2006-11-10 01:44) [18]
> Дал новый код, давай теперь новый вопрос.
Забрал только else, не нужно его там было, но от этого ничего не изменилось.Проблема осталась, процедура CloseTabs выполняется в любом случае.А есть хоть какие-нибудь предположения почему такое может происходить?Может глюк компилятора,а?
← →
Германн © (2006-11-10 01:59) [19]Не нашел в коде ни одного места, где переменной IsGazetaOpened присваивается True, кроме procedure TMainForm.ToolButton2Click. Но в ней всё чисто, вроде бы. Нет ли у тебя ещё кода, который ты не привёл?
На "глюк компиллятора" пока не стоит упирать.
← →
lockheed_man © (2006-11-10 02:04) [20]Вот полный вариант модуля:
var
MainForm: TMainForm;
CurrentUser: String = "VoVa";
isAdmin: Boolean = True;
IsGazetaOpened: Boolean = False;
GazetaNumber: Word;
ColorPages: array of TColorPage;
PageNumbers: array of Byte;
implementation
uses ULogin, UUsers, UGazetaNumber;
{$R *.dfm}
procedure TMainForm.AddEditBlockBtnClick(Sender: TObject);
var
newBlock: TBlock;
vContainer: TWinControl;
begin
if not IsGazetaOpened then
begin
ShowMessage("Невозможно добавить блок."+#13+#10+"Не открыта ни одна страница");
Exit;
end;
//prepare block
newBlock := TBlock.Create;
with newBlock do
begin
SetAgent(CurrentUser);
SetFirma(FirmaEdit.Text);
SetPhone(PhoneEdit.Text);
SetPrepaied(PrepaiedEdit.Text);
case BlockSize.ItemIndex of
0: SetBlockSize(30);
1: SetBlockSize(60);
2: SetBlockSize(90);
3: SetBlockSize(120);
end;
case Orientation.ItemIndex of
0: SetOrientation(1); //horizontal
1: SetOrientation(0); //vertical
end;
SetText(BlockText.Text);
SetPageNumber(PageNumbers[PageControl.ActivePageIndex]);
end;
with ColorPages[PageControl.ActivePageIndex] do
begin
AddBlock(newBlock);
DrawBlock(newBlock);
end;
end;
procedure TMainForm.CloseTabs;
var
i: Byte;
begin
for i := 0 to PageControl.PageCount - 1 do
begin
PageControl.ActivePage.Free;
//ColorPages[i].Free;
end;
IsGazetaOpened := False;
end;
procedure TMainForm.CreateTab(TabNumber, PageNumber: Byte);
var
vSheet: TTabSheet;
begin
{create page tab}
vSheet := TTabSheet.Create(Self);
with vSheet do
begin
PageControl := MainForm.PageControl;
PageIndex := TabNumber;
Caption := "Страница " + IntToStr(PageNumber);
Show;
end;
ColorPages[TabNumber] := TColorPage.Create(PageNumber, GetBlocksQuery.RecordCount, vSheet);
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
GetBlocksQuery.Close;
GetGazetaQuery.Close;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
if isAdmin then mAdmin.Enabled := True;
StatusBar.Panels[1].Text := "Пользователь: " + UpperCase(CurrentUser);
end;
procedure TMainForm.GetPageNumbers(Pages: String);
var
strLength: Byte;
i, j: Byte;
strPage: String;
begin
strLength := Length(Pages);
strPage := "";
j := 0;
SetLength(PageNumbers, GetGazetaQueryG_PAGECOUNT.Value);
for i := 1 to strLength + 1 do
begin
if (Pages[i] <> ",") and (Pages[i] <> #0) then strPage := strPage + Pages[i]
else begin
PageNumbers[j] := StrToInt(strPage);
Inc(j);
strPage := "";
end;
end;
end;
procedure TMainForm.HideBtnClick(Sender: TObject);
begin
BlockInfo.Visible := False;
end;
procedure TMainForm.mAddNewBlockClick(Sender: TObject);
begin
BlockInfo.Visible := True;
end;
procedure TMainForm.mExitClick(Sender: TObject);
begin
Close;
end;
procedure TMainForm.mUsersClick(Sender: TObject);
begin
Application.CreateForm(TUsersForm, UsersForm);
Application.Run;
end;
procedure TMainForm.ToolButton2Click(Sender: TObject);
var
i: Byte;
begin
with GetGazetaQuery do
begin
ParamByName("G_NUMBER").Value := 1;
Open;
end;
GetPageNumbers(GetGazetaQueryG_PAGENUMBERS.Value);
SetLength(ColorPages,GetGazetaQueryG_PAGECOUNT.Value);
with GetBlocksQuery do
begin
ParamByName("G_ID").Value := GetGazetaQueryG_ID.Value;
Open;
end;
if IsGazetaOpened then CloseTabs;
for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do CreateTab(i,PageNumbers[i]);
IsGazetaOpened := True;
end;
end.
← →
Германн © (2006-11-10 02:59) [21]По приведённому в [20] коду всё нормально. Но на "глюк компиллятора" по прежнему не расчитывай.
← →
lockheed_man © (2006-11-10 04:36) [22]
> По приведённому в [20] коду всё нормально. Но на "глюк компиллятора"
> по прежнему не расчитывай.
>
Получается, что без вариантов. Да уж, голяк. В любом случае спасибо за терпение и комментарии.
← →
ЮЮ © (2006-11-10 05:33) [23]
> Когда исполняю его по F8, то все выполняется правиль, когда
> просто запускаю по F9, то независимо от того, выполняется
> услови или нет, исполняется код записанный перед Else. От
> чего это может зависеть? Заранее спасибо.
>
Откуда возникло вообще такое предположение, если по обеим веткам делается одно и то же. И вообще GazetaOpened и это ветка ни к чему. Почему не просто
CloseTabs; //убить закладки, если есть
for i := 0 to GetGazetaQueryG_PAGECOUNT.Value - 1 do
CreateTab(i,PageNumbers[i]) //создать закладки
Кстати, лучше цикл делать не до GetGazetaQueryG_PAGECOUNT.Value - 1, а до High(PageNumbers), ибо твой код не гарантирует их равенство, а при отключеном "Range Checking" - источник проблем
← →
Loginov Dmitry © (2006-11-10 07:56) [24]Dmitrij_K (09.11.06 16:48) [2]
в 99,9% это ошибка в программе
как минимум 99,99%
^)
← →
lockheed_man © (2006-11-10 08:34) [25]Всем спасибо. Причину нашел. > как минимум 99,99% - чистая правда. Неправильно связал пункт меню и кнопку, связанную с этим пунктом. Как результат - процедура выполнялась дважды.
Всем большое спасибо за советы и критику.
← →
Rouse_ © (2006-11-10 11:26) [26]если хочешь еще критику то
> "Не открыта ни одна страница" будет аналогом: русский речь меня покинул ;)
← →
lockheed_man © (2006-11-10 13:59) [27]
> если хочешь еще критику то
> > "Не открыта ни одна страница" будет аналогом: русский
> речь меня покинул ;)
>
И сразу же свой вариант, плз.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.12.24;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.114 c