Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5

Модерирует : ShIvADeSt

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 4

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    V1s1ter



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Мужики, вылечите мне голову, или нервы.    
    Был проект под ТР7, портировали под Д2007.
    Все работало, мы его дополняли и т.д.
    И вот в один день стал вылетать в одном месте. , А именно
    если есть код такой  

    Код:
    var
      I: Byte;
      L: Integer;
    begin
      try
        L := 0;
        for I := 0 to L - 1 do begin
            сюда заходит.
        end;
     

    То всегда заходит в тело цикла, а если такой

    Код:
    var
      I: Integer;
      L: Integer;
    begin
      try
        L := 0;
        for I := 0 to L - 1 do begin
            сюда не заходит.
        end;
     

    То в тело цикла не заходит.
    Вопрос почему в первом случае попадает в цикл - это баг, фича или настройка какая-то?
    Если не настройка, то почему два года работало, пережило n-е количество компиляций, а потом вдруг стало вылетать?  
    До  и во время возникновения этой ошибки изменения в Делфи не делали и апдейты не накладывали.

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 14:56 28-12-2009 | Исправлено: V1s1ter, 14:58 28-12-2009
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V1s1ter
    Потому что нежелательно использовать в циклах FOR переменные беззнаковых типов.
    Особенно, когда есть выражение вида Length - 1.
    В первом цикле 0 - 1 = 255 и будет 256 итераций, что неправильно - должно быть ни одной.
    А во втором всё правильно.
    А вообще при сравнении лучше избегать смешивания знаковых и беззнаковых типов.
    Есть хороший пост и комментарии к нему http://alex.ciobanu.org/?p=175

    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 15:19 28-12-2009 | Исправлено: data man, 15:20 28-12-2009
    V1s1ter



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    data man
    Все правильно, но сдругой стороны где пресловутое преобразование типов и почему полгода работало?...

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 16:21 28-12-2009
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V1s1ter

    Цитата:
    а потом вдруг стало вылетать?

    Вылетает на этапе компиляции или выполнения программы ?
    Опции проекта менялись ? В частности  "R-  Range checking" ?

    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 16:33 28-12-2009
    zakov



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Знатоки, помогите!
     
    Почему у меня сообщение WM_SETTEXT не перехватывается?
    Вот код:

    Код:
    // реализация оконной процедуры управления дочерним окном,
    // на которую заменена стандартная процедура
    procedure TzakWindowBarButton.ChildWndProc(var Message: TMessage);
    begin
    case Message.Msg of
        WM_SETTEXT:     // установка заголовка окна
        begin
          showMessage('Смена заголовка!');
        end;
        WM_SETICON:
        begin
           showMessage('Смена иконки!');
        end;
        wm_Destroy:   // уничтожается окно
        begin
          Destroy;
        end;
        wm_MDIActivate:
        begin
          down:=true;
        end;
      end;
      // вызов стандартного (старого) метода обработки сообщения для обработки сообщения
      Message.Result:= CallWindowProc(OldChildWndProc, Fwindow, Message.Msg, Message.WParam, Message.LParam);
    end;

     
    Причем WM_SETICON отрабатывает, а на установку текста заголовка нет.
    Никак не пойму где грабли. В других исходных текстах компонент сделано похожим образом, и все вроде как работает.

    Всего записей: 163 | Зарегистр. 24-01-2008 | Отправлено: 00:18 29-12-2009 | Исправлено: zakov, 00:19 29-12-2009
    V1s1ter



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    data man
    Спасибо за участие. Разобрался сам, а то уж перенервничал. Просто все это время были такие данные, что указанный  цикл ни разу не вызывался!  
    Прошу прощения, что побеспокоил - дюже перенервничал я, проект то серьезный , а тут такие "непонятки".    
     
    Добавлено:
    zakov
    Вникать где грабли пока времени нет, но вот так работает:

    Код:
      TMDIChild = class(TForm)
          procedure WndProc(var Message: TMessage); override;
    ....
    procedure TMDIChild.WndProc(var Message: TMessage);
    begin
      if Message.Msg = WM_SETTEXT then begin
        чегото делаем
      end;
      inherited;
    end;
     

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 00:25 29-12-2009
    zakov



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    V1s1ter
     
    Да у меня тоже так работает
    а как его перехватить в другом компоненте?
    Фактически в моем коде, приведенном выше, делается тоже самое. Метод WndProc для дочерних окон подменяется моей реализацией, из которой вызывается подмененый после моих каких-то действий. Но так почему-то не работает ...
    Код-то такойже или я что-то недопонимаю???

    Всего записей: 163 | Зарегистр. 24-01-2008 | Отправлено: 01:21 29-12-2009
    V1s1ter



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    zakov
    Чего то я не понял, что на что у вас подменяется. Я не нашел в исходниках ChildWndProc который Вы подменяете. Что значит
    Цитата:
    как его перехватить в другом компоненте

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

    Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 02:21 29-12-2009
    zakov



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Пишу компонент, у которого определена процедура, на которую при создании объекта подменяется метод WndProc дочернего окна

    Код:
     
    constructor TzakWindowBarButton.Create(AOwner: TComponent;
      WindowHandle: THandle);
    begin
      Create(AOwner);
      Fwindow := WindowHandle;
     
      // получение указателя на новую процедуру
      InstanceChildWndProc := MakeObjectInstance(ChildWndProc);
      // установка новой оконной процедуры для дочернего окна и сохранение указателя на старую процедуру
      OldChildWndProc := Pointer(SetWindowLong(WindowHandle, GWL_WNDPROC, Longint(InstanceChildWndProc)));
    end;
     

     
    Таким образом, я хочу, чтобы мой компонент перехватывал сообщения, посылаемые дочерней форме приложения. Все перехватываются кроме wm_settext. Т.е. получается, что дочерняя форма этого сообщения не получает. Хотя код выше с переопределением WndProc демонстрирует обратное.

    Всего записей: 163 | Зарегистр. 24-01-2008 | Отправлено: 02:34 29-12-2009
    90Kinoman



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вычислить высоты треугольника со сторонами а, b, с.

    Всего записей: 26 | Зарегистр. 14-12-2009 | Отправлено: 17:08 29-12-2009
    JohnSilver182



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hi All
    А есть у кого пример кода создания  динамически формы   и передача ей каких либо параметров ???
     
    Я просто по имени формы могу создать из любого модуля без  Тонн USES ,  
    НО !!  параметры приходиться пересылать через SendMessages
     

    Код:
    procedure TDM.FormLoaderMDI (const FormName:String;)
    var
      I:integer;
      //F: TCustomForm;
      F:TForm;
      bExists:boolean;
    begin
    try
        bExists:=false;
        for I := 0 to Screen.FormCount - 1 do
              if  Lowercase('t'+Screen.Forms[i].Name)= Lowercase(FormName) then
                begin
                  bExists:=true;
                  F:=Screen.Forms[i];
                end;
     
        if bExists=false then   F := TFormClass(FindClass(FormName)).Create(Application)
           else
              f.BringToFront;
        f.Visible:=true;
    finally
    end;
     
    end;

     

    Всего записей: 829 | Зарегистр. 03-06-2009 | Отправлено: 17:45 29-12-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    90Kinoman
    Вы топиком ошиблись. Вам сюда: http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=2395#1
    JohnSilver182
    Думаю вам в сторону RTTI стоит глянуть.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 18:19 29-12-2009
    ppkp

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Необходимо вводить данные разных типов. Для этого создаю классы для каждого типа
    TClass1 = class(TBaseClass)
    public
      StringVar: string;
      property PropCount;
    end;
     
    TClass2 = class(TBaseClass)
    public
      DateTimeVar: TDateTime;
      IntegerVar: integer;
      property PropCount;
    end;
    .............
    и т.д. Не знаю, как вызвать соответствующий класс, т.к. не знаю какого типа должна быть X
    var  X: T?????
     
    case dataType of
      dt1: X := TClass1.Create;
      dt2: X := TClass2.Create;
    end;
    Caption := X.IntegerVar - ее не видно в X
     
    Пробовал объявлять X типа pointer, TClass, TObject - ничего не получается.
    Какого типа должна быть X ?

    Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 21:03 29-12-2009
    NOwlar



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ppkp
     
    TBaseClass
     
    Вообще, и с TObject должно было срабоать, а чтобы обратиться к IntegerVar напиши
    Caption := (X as TClass2).IntegerVar

    Всего записей: 170 | Зарегистр. 25-01-2006 | Отправлено: 21:09 29-12-2009 | Исправлено: NOwlar, 21:12 29-12-2009
    ppkp

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NOwlar
    TBaseClass = class
    private
      FBlockType: TBlockType;
    protected
      function GetPropCount: integer;
    public
      GeoClass: TObject;//TClass;???????????????
      constructor Create(ABlockType: TBlockType);
      destructor Destroy; override;
      property BlockType: TBlockType read FBlockType;
      property PropCount: integer read GetPropCount;
    end;

    Цитата:
    Caption := (X as TClass2).IntegerVar  

    1.Но я не знаю что писать после as TClass1 или TClass2
    2. TBaseClass не содержит IntegerVar

    Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 21:20 29-12-2009 | Исправлено: ppkp, 21:22 29-12-2009
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ppkp
    Читай статьи про инспекторы объектов, например:
    Flexible Frame - механизм добавления к объекту произвольных характеристик без использования наследования
    Инспектор объектов и метаданные

    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 21:35 29-12-2009
    ppkp

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Попробовал
    var
      AClass: TBaseClass;//TObject;//TClass;
     
    case bt of
      bt1: begin
      X := TClass1.Create(bt1);
      AClass := X as TClass1;
      end;
     
      bt2: begin
      X := TClass2.Create(bt2);
      AClass := X as TClass2;
      end;
    end;
     
    AClass.StringVar - не видит
     
     
    Добавлено:
    data man
    Предыдущее добавил до Вашего поста.

    Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 21:38 29-12-2009
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ppkp
    А тип Variant вам не подойдет?

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 22:29 29-12-2009
    ppkp

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Нет, не проходит. Попробовал так
     
    case bt of
     bt1: X := TClass1.Create(bt1);
     bt2: X := TClass2.Create(bt2);
    end;
     
    case X.BlockType of
     bt1: Caption := (X as TClass1).StringVar;
     bt2: Caption := FormatDateTime('dd.mm.yy', (X as TClass2).DateTimeVar);
    end;
     
    и, естественно, заработало. Но это не совсем то, чего хотелось бы - универсальности. Наверное, действительно нужно хорошо изучить TypInfo.pas

    Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 23:04 29-12-2009 | Исправлено: ppkp, 23:07 29-12-2009
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ppkp

    Цитата:
    Но это не совсем то, чего хотелось бы - универсальности.

    Вот ! Я поэтому и привел ссылки на инспекторы, так как следующий шаг - удобное редактирование свойств объектов, верно ?
    В D2010 этим и удобны аттрибуты - гибкостью. И уже куча материала по работе с ними есть.
    Если интересно - закидаю ссылками.

    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 23:18 29-12-2009
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru