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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



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

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


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


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    Termis



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

    Цитата:
    с точки зрения правильности написания, лучше вынести в другой модуль объявление типов.  
    Если Unit2 со временем разрастется до неприличных размеров - будет не кашерно...
    Ради одного типа тянуть весь модуль в проект...

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

    Всего записей: 423 | Зарегистр. 17-11-2012 | Отправлено: 10:27 19-11-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Termis
    с одной стороны, если всё в unit2 - то при использовании будет Uses Unit2 и всё. Если сделать определения в отдельном модуле - будете по 2 подключать uses Unit2, Unit3.
    и всё таки - на чём экономим 2 юнита оно и чище будет, и гибче

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 21:22 19-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ant0ni02004
    в этом смысле мне нравится идеология c#(. net): каждый класс(enum)-в отдельный модуль.

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 22:53 19-11-2012
    Termis



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо, вынес все-таки в новый файл - действительно удобнее. Все по полочкам.

    Всего записей: 423 | Зарегистр. 17-11-2012 | Отправлено: 01:53 20-11-2012
    sammozg



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребята, не подскажите, может я чего не догоняю, в общем запускаю прогу в делфи, через несколько циклов работы потока выдаёт ошибку чтения по адресу 00000000, но если я запускаю её-же без делфи ошибки нет, хотел посмотреть где ошибка, он меня выкидывает всё время на дисконект (IdTCPClient), а может мне просто забить на эту ошибку?

    Всего записей: 90 | Зарегистр. 30-06-2011 | Отправлено: 06:32 20-11-2012
    exteris

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

    Цитата:
    но если я запускаю её-же без делфи ошибки нет

    Вы случаем try-except-ом ошибку нигде не душите?

    Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 09:40 20-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sammozg
    Можно же логи повтыкать повсюду и найти в чем проблема.
     
    можете на этот логер посмотреть: хттп://log4delphi.sourceforge.net/
    или подключить Eurekalog какой нить (так будет даже проще)

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 11:14 20-11-2012 | Исправлено: salexn1, 11:24 20-11-2012
    sammozg



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    exteris
    Я сначало так-же думал но после того как убрал почти все try-except нечего не изменилось, оставил только  
    try
    Client1.ReadBuffer(buffer[i],lenSav);
    except
    OshibkaTMP:=OshibkaTMP+1;
    end;
     
    salexn1
    логами в принципе и можно только код потока здаравенный больно
    http://forum.ru-board.com/topic.cgi?forum=33&topic=11215&start=1366&limit=1&m=1#1
    Правда этот код претерпел немного изменений
    последним было установка Indy10, может в этом проблема?

    Всего записей: 90 | Зарегистр. 30-06-2011 | Отправлено: 11:57 20-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sammozg
    заюзайте тогда Eurekalog и посмотрите, что происходит.
    Как правило бывает наоборот: под Delphi все работает правильно, а потом падает в реальной жизни...

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 12:08 20-11-2012
    snike555



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

    Цитата:
    заюзайте тогда Eurekalog и посмотрите, что происходит

    +1
    обязательно настройте отсылку логов себе

    Всего записей: 380 | Зарегистр. 02-10-2009 | Отправлено: 13:20 20-11-2012
    sammozg



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    salexn1
    snike555
    Я тут немного по другому сделал, через менеджер потоков вышел на поток в котором ошибка и запустил отладчик, в итоге ошибка вылетает в Kernel32.RaiseException
    в строчке 7C812AEB POP ESI, а вот теперь что с ней делать понятия не имею, не я же создавал эту процедуру...
     
    Только вспомнил в Embarcadero RAD Studio 2010 выходила подобная ошибка тоже с файлом Kernel32 на компоненте Indy...

    Всего записей: 90 | Зарегистр. 30-06-2011 | Отправлено: 14:07 20-11-2012 | Исправлено: sammozg, 14:40 20-11-2012
    salexn1



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

    Цитата:
    Kernel32.RaiseException

    я думаю (точнее уверен), что проблема где-то уровнем выше, т.е. в вашем коде.
     
    Kernel32.RaiseException - это уже последствия

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 15:55 20-11-2012
    sammozg



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Если я правильно понял то этот участок кода Kernel32.RaiseException отвечает за исключительные ситуации??? Если так,тогда наверное стоит убрать все try-except и повторить попытку, найти суть проблемы, я правильно мыслю?

    Всего записей: 90 | Зарегистр. 30-06-2011 | Отправлено: 17:37 20-11-2012
    ant0ni02004

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sammozg
    ну и здоровенный код у вас, сразу и не разберёшься
     
    а поставьте проверки (всюду после lenSav:=......), что lenSav не превышает размер буффера, в который вы считываете потом данные (т.е. 512 байт)
    может быть в этом дело, или наоборот - в том, что пытаетесь прочитать больше, чем пришло на самом деле

    Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 18:29 20-11-2012 | Исправлено: ant0ni02004, 18:30 20-11-2012
    salexn1



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

    Цитата:
    убрать  все try-except и повторить попытку

     
    Это самая умная  мысль...
    Только прикрутите EurekaLog

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 00:14 21-11-2012
    xliker



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Здравствуйте. Такая проблема: создал компонент, наследник TStringGrid, в нем есть свойство типа TStringList, в конструкторе оно создается. Оно описано как published, в инспекторе объектов появляется соответствующее свойство. Кидаю компонент на форму, заполняю это свойство, оно вполне себе корректно отображается в моем компоненте, но при запуске программы запускается конструктор моего компонента, и в нем это свойство создается заново, таким образом не отображая информацию, введенную на этапе проектирования. Код с комментариями прилагается. Спасибо.

    Код:
     
      TMarkTable = class(TStringGrid)
      private
        FFio  : TStringList;
        FMark : TArray;
      protected
        procedure SetFio(value : TStringList);
        procedure SetMark(value : TArray);
        function  SelectCell(ACol, ARow : Longint) : boolean; override;
        procedure DrawCell(ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);  override;
      public
        constructor Create(AOwner : TComponent); override;
        procedure   MoveData();
        destructor  Destroy();  override;
      published
        property Fio : TStringList read FFio write SetFio;  //вот это свойство
        property Mark : TArray read FMark write SetMark;
      end;
     
    constructor TMarkTable.Create(AOwner : TComponent);
    begin
      inherited Create(AOwner);
      FFio := TStringList.Create;       //конструктор при запуске программы этой командой создает новый TStringList, не сохраняя мой
      FMark := TArray.Create;
      ColCount := 2;
      RowCount := 2;
      FixedCols := 0;
      FixedRows := 1;
      Cells[0,0] := 'Фамилия';
      Cells[1,0] := 'Балл';
    end;
     

    Всего записей: 17 | Зарегистр. 06-09-2011 | Отправлено: 21:38 28-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xliker
    Я думаю, что SetFio у вас вот такое вот:
     
    procedure TMarkTable.SetFio(const Value: TStringList);
    begin
      FFio := Value;
    end;
     
    а должно быть
     
    procedure TMarkTable.SetFio(const Value: TStringList);
    begin
      FFio.Assign(Value);
    end;
     
    и будет все ок

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 23:33 28-11-2012
    xliker



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    salexn1, нет, как раз через Assign делал, вот как:

    Код:
     
    procedure TMarkTable.SetFio(value : TStringList);
    begin
      FFio.Assign(value);
      MoveData;
    end;
     
    procedure TMarkTable.MoveData();
    var
      i : integer;
    begin
      RowCount := Max(Fio.Count, Mark.Size) + 1;
      for i:=0 to FFio.Count-1 do
        Cells[0,i+1] := Fio.Strings[i];
      for i:=0 to FMark.Size-1 do
        Cells[1,i+1] := IntToStr(Mark.GetValue(i));
    end;  
     


    Всего записей: 17 | Зарегистр. 06-09-2011 | Отправлено: 19:57 29-11-2012
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xliker
    Конструктор тут не при чем.
    Выложите весь код, что ли...

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 22:39 29-11-2012
    xliker



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    salexn1, подсказали проверить файл формы (.dfm). Там вместо введенных мной значений вот такое:

    Код:
     
    //...
        Fio.Strings = (
          #1055#1077#1088#1074#1099#1081
          #1042#1090#1086#1088#1086#1081)
    //...
     

    Я так понимаю, это неверно? Должны быть записаны непосредственно введенные значения? Если так, где может крыться ошибка? Весь код показать?

    Всего записей: 17 | Зарегистр. 06-09-2011 | Отправлено: 12:14 30-11-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru