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

Вниз

глюки в Дельфях   Найти похожие ветки 

 
Megabyte ©   (2004-12-17 22:48) [0]

Народ. Первый раз наткнулся на такой прикол. Причем даже человека позвал, чтобы убедиться, что руки все таки не кривые. Он мне заявил, что это глюк.

Есть условие выбора. Так вот при выполнении(if) этого условия у меня должно выдать showmessage, при невыполнении(else) сделать некоторые вычисления и закрыть форму.
Глюк: при выполнении условия Дельфя выдает showmessage и в добавок выполняет все, что после else, т.е. вычисления и закрытие формы.
Попытался поменять условие на обратное и, соответственно, поменял действия наоборот, та же фигня.
Даже не знаю, что им делать... :(((
У меня там проверка некоторых условий идет.


 
Sergey_Masloff   (2004-12-17 22:51) [1]

Такого не бывает. Полный код в студию.


 
Palladin ©   (2004-12-17 22:54) [2]

А у меня за окном снег наверх падает. Снял на пленку, показал друзьям. Они сказали это глюк.


 
Megabyte ©   (2004-12-17 22:55) [3]

procedure TFrm4.BitBtn1Click(Sender: TObject);
var
  i, j : integer;
begin
  for j := 0 to 2  do begin
     if  (B_Down[0,j] or B_Down[1,j] or B_Down[2,j]) = true then begin
        key2 := true;
        DtMd.T_Sub_vibor.Refresh;
        Frm4.Close;
        with DtMd.T_Sub_vibor do
        begin
           i := 0;
           first;
           while not EOF do begin
              for i := N_sys to 13 do begin
                 if DBTxt1.Caption = Type_sys[j] then begin
                    S_type_sys[i] := DBTxt1.Caption;
                    S_var_type[i] := DBTxt2.Caption;
                    S_mas_sum[i] := StrToInt(DBTxt3.Caption);
                 end; {if}
              end; {for}
              i := i + 1;
              next;
           end; {while}
        end; {with}
        if key2 = true then begin
           frm3.Label8.Enabled := true;
           frm3.Label9.Enabled := true;
           frm3.BBtn2.Enabled := true;
           frm3.Label1.Enabled := false;
           frm3.Label2.Enabled := false;
           frm3.BBtn1.Enabled := false;
        end; {if}
     end {if}
     else begin
        showmessage("Ñëåäóåò âûáðàòü îäèí êîýôôèöèåíò äëÿ êàæäîãî      óñëîâèÿ");
     end; {else}
  end; {for}
end;

Вот уже сделал наоборот. Если условие не выполняется, то выдает сообщение, + делает все действия полсе then и  в том числе закрывает форму(т.е. сразу видно, что не так работает). :(


 
ssk ©   (2004-12-17 22:55) [4]

насколько я понял из описания глюка, не работает следующая конструкция, верно?


var
 a, b: integer;
begin
 a := 0;
 if a = 0 then
   ShowMessage("OK")
 else
   begin
     b := 1; // некоторые вычисления
     Close;  // закрытие
   end;
end;


 
Megabyte ©   (2004-12-17 23:02) [5]

begin
if a = true then begin
вычисления;
закрытие формы;
end;
else
showmessage();

а = thue, то делает выисления и закрытие.
а = false, то выдает сообщение + делает выисления и закрытие.


 
ssk ©   (2004-12-17 23:08) [6]

может это if  (B_Down[0,j] or B_Down[1,j] or B_Down[2,j]) = true then begin

нужно заменить просто на if  B_Down[0,j] or B_Down[1,j] or B_Down[2,j] then begin ?

как-то логика не складывается...
у себя проверил [5] - нормально отрабатывает.


 
Palladin ©   (2004-12-17 23:12) [7]

Во первых i:=0 и i:=i+1; не понятно для чего. Во вторых от половины begin end можно избавится. И вообще переформатировав код становится понятно, что глюки у тебя и твоих друзей.

var
i, j : integer;
begin
for j:=0 to 2 do
 if (B_Down[0,j] or B_Down[1,j] or B_Down[2,j]) then
  begin
   key2 := true;
   DtMd.T_Sub_vibor.Refresh;
   Frm4.Close;
   DtMd.T_Sub_vibor.First;
   With DtMd.T_Sub_vibor Do  while not EOF do
    begin
     for i := N_sys to 13 do
      if DBTxt1.Caption = Type_sys[j] then
       begin
        S_type_sys[i] := DBTxt1.Caption;
        S_var_type[i] := DBTxt2.Caption;
        S_mas_sum[i] := StrToInt(DBTxt3.Caption);
       end; {if}
     next;
    end; {with}
   if key2 = true then
    begin
     frm3.Label8.Enabled := true;
     frm3.Label9.Enabled := true;
     frm3.BBtn2.Enabled := true;
     frm3.Label1.Enabled := false;
     frm3.Label2.Enabled := false;
     frm3.BBtn1.Enabled := false;
    end; {if}
   end else showmessage("Neaaoao aua?aou iaei eiyooeoeaio aey ea?aiai      oneiaey");
end;

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


 
Megabyte ©   (2004-12-17 23:15) [8]

Закидайте меня камнями. Я торможу уже в конце рабочей недели.
1-й вариант) Я почему-то думал, что для  "if" будет достаточно одного неверного "for j := 0 to 2  do begin" ,чтобы прога только показала сообщение.
А у меня только в одном случае(при одном j) не выполняется условие. Вот по счетчику у меня j менялось, и выполнялось условие else  ^)

Сделал так, все работает, как надо:

procedure TFrm4.BitBtn1Click(Sender: TObject);
var
  i, j : integer;
label
  vihod;
begin
  for j := 0 to 2  do begin
     if  (B_Down[0,j] or B_Down[1,j] or B_Down[2,j]) = false then begin
        showmessage("Ñëåäóåò âûáðàòü îäèí êîýôôèöèåíò äëÿ êàæäîãî óñëîâèÿ");
        goto vihod;
     end; {if}
  end; {for}
        key2 := true;
        DtMd.T_Sub_vibor.Refresh;
        Frm4.Close;
        with DtMd.T_Sub_vibor do
        begin
           i := 0;
           first;
           while not EOF do begin
              for i := N_sys to 13 do begin
                 if DBTxt1.Caption = Type_sys[j] then begin
                    S_type_sys[i] := DBTxt1.Caption;
                    S_var_type[i] := DBTxt2.Caption;
                    S_mas_sum[i] := StrToInt(DBTxt3.Caption);
                 end; {if}
              end; {for}
              i := i + 1;
              next;
           end; {while}
        end; {with}
        if key2 = true then begin
           frm3.Label8.Enabled := true;
           frm3.Label9.Enabled := true;
           frm3.BBtn2.Enabled := true;
           frm3.Label1.Enabled := false;
           frm3.Label2.Enabled := false;
           frm3.BBtn1.Enabled := false;
        end; {if}
vihod:
end;


 
VMcL:   (2004-12-18 00:16) [9]

>>Megabyte ©  (17.12.04 23:15) [8]

goto vihod;
заменить на
Exit;

if  (B_Down[0,j] or B_Down[1,j] or B_Down[2,j]) = false then
заменить на
if not (B_Down[0,j] or B_Down[1,j] or B_Down[2,j]) then
или
if not B_Down[0,j] and not B_Down[1,j] and not B_Down[2,j] then



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

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

Наверх




Память: 0.48 MB
Время: 0.035 c
1-1103358594
Kolan
2004-12-18 11:29
2005.01.02
GetTickCount - где он?


1-1103531158
nickola
2004-12-20 11:25
2005.01.02
как узнать "ширину" строки


3-1102060200
Script
2004-12-03 10:50
2005.01.02
Индексирование в Paradox БД


1-1103189510
СЕМЕН
2004-12-16 12:31
2005.01.02
Что сделать с курсорами?


3-1102101958
td
2004-12-03 22:25
2005.01.02
чем отличается dBaseIII+ от dBaseIV?





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