Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Загадочное поведение if-оператора


Автор: a_n_d_y 15.6.2007, 01:51
Ув. форумчане!!!
Вот, в чем заключается проблема

Код

var
  groupList: TList; 
//...
  for i := 0 to groupList.Count - 1 do
  begin
    group := groupList.Items[i];            
    if group^.GroupCaption = name then
    begin // в этот блок я не могу попасть даже тогда, когда условие выполняется...
      result := group;
      break;
    end;
  end;

Автор: cardinal 15.6.2007, 02:00
Цитата

в этот блок я не могу попасть даже тогда, когда условие выполняется...

А ты уверен в том, что оно выполняется. Чему равно group^.GroupCaption и name тогда, когда ты думаешь, что они равны?

Автор: a_n_d_y 15.6.2007, 02:08
уверен.. (в дебаге это видно)
Компилятор говорит, что в блоке unreacheble code

Автор: cardinal 15.6.2007, 02:17
А так:
Код

if (group^.GroupCaption) = name then

Я просто Delphi не знаю, так преположения...

Если это не пройдет, то читай тут http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1206

Автор: a_n_d_y 15.6.2007, 02:20
Цитата(cardinal @  15.6.2007,  02:17 Найти цитируемый пост)
А так:
Код

if (group^.GroupCaption) = name then



то же самое =)

Автор: cardinal 15.6.2007, 02:26
Какой тип у group^.GroupCaption и какой у name? Попробуй так:
Код

var
  P1, P2: PChar;
...
  P1 := StrNew(group^.GroupCaption);
  P2 := StrNew(name);
  if P1 = P2 then
...
  StrDispose(P1);
  StrDispose(P2);

Автор: Alex 15.6.2007, 03:36
Код

var
  groupList: TList; 
//...
  for i := 0 to groupList.Count - 1 do
  begin
    group := groupList.Items[i];            
    if AnsiSameText(group^.GroupCaption, name) then // Сравнение строк без учета регистра
    begin // в этот блок я не могу попасть даже тогда, когда условие выполняется...
      result := group;
      break;
    end;
  end;

Автор: aktuba 15.6.2007, 06:04
Попробую угадать... Name - это скорее всего подразумевается переменная, а Delphi берет название формы. Уже много раз советовали - не называйте переменные зарезервированными словами!.

Автор: MetalFan 15.6.2007, 07:08
Цитата(aktuba @  15.6.2007,  06:04 Найти цитируемый пост)
не называйте переменные зарезервированными словами

ну name не зарезервированное слово... просто оно используется в TComponent.
но идея не использовать такие простые имена для локальных и глобальных переменных весьма на мой взгляд правильна

Автор: aktuba 15.6.2007, 07:56
Цитата

ну name не зарезервированное слово...


Виноват, не правильно выразился...

Автор: a_n_d_y 15.6.2007, 08:32
Цитата

Какой тип у group^.GroupCaption и какой у name?

WideString

Цитата

// Сравнение строк без учета регистра

в случае, когда group^.GroupCaption и name были равны '123'я в блок тоже не попадаю. так что, думаю, не в этом дело..

Цитата

Name - это скорее всего подразумевается переменная, а Delphi берет название формы

в данном случае, name - это строковой параметр, который передается в метод, фрагмент которого я и показал..
метод ничего не знает ни про какие формы..

Автор: MetalFan 15.6.2007, 08:58
давай пример приложения... а так мы ж не телепаты! smile

Автор: Igor_thief 15.6.2007, 09:31
Уверен что нету в конце пробелов?

Попробуй WideCompareText

Автор: aktuba 15.6.2007, 09:37
a_n_d_y, Покажи полный код процедуры...

Автор: Sunvas 15.6.2007, 11:03
Цитата(aktuba @  15.6.2007,  06:04 Найти цитируемый пост)
Name - это скорее всего подразумевается переменная, а Delphi берет название формы.

Кстати, меня тоже эта мысль посетила. Что, если просто переименовать переменную?

Автор: a_n_d_y 15.6.2007, 11:32
уже разобрался...
всем спасибо!

Автор: Igor_thief 15.6.2007, 11:34
Цитата(a_n_d_y @  15.6.2007,  10:32 Найти цитируемый пост)
уже разобрался...
всем спасибо! 

И в чем же был гвоздь?

Автор: aktuba 15.6.2007, 11:40
Цитата

уже разобрался...
всем спасибо! 


Как думаешь, после такого тебе захотят помочь в будущем, если ты задал вопрос, решил его но не сказал как решил и в чем была проблема????

Автор: a_n_d_y 15.6.2007, 11:55
нет..не разобрался....


У делфи как-то странно с указателями работает....

а в частности - TList...

есть класс TContactGroup
в списке есть экземпляры этого класса..
при попытке прочитать объект оттуда возникает Access Violation

вот код метода..
Код

function TContactList.getGroupByName(grName: WideString): PContactGroup;
var
  i: integer;
  group: PContactGroup;
begin
  for i := 0 to groupList.Count - 1 do
  begin
    group := groupList.Items[i];
    if group.GroupCaption = grName then
    begin // Can't understand why I can't get inside this block
      result := group;
      exit;
    end;
  end;
  result := nil;
end;

Автор: aktuba 15.6.2007, 12:49
Код

function TContactList.getGroupByName(grName: WideString): PContactGroup;
var
  i: integer;
begin
  result := nil;
  for i := 0 to groupList.Count - 1 do
  begin
    if PContactGroup(groupList[i])^.GroupCaption = grName then
    begin // Can't understand why I can't get inside this block
      result := PContactGroup(groupList[i]);
      break;
    end;
  end;
end;


Попробуй так. И кстати, судя по тому, что ты изменил название переменной - я был прав =)))))

Автор: a_n_d_y 15.6.2007, 13:36
aktuba, спасибо, это помогло =)
а имя переменной я на всякий случай поменял...

Автор: aktuba 15.6.2007, 14:16
Цитата

а имя переменной я на всякий случай поменял... 


Всегда так поступай =)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)