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

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

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

ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы http://forum.ru-board.com/topic.cgi?forum=33&topic=3647&start=2020#lt
Внимание, все большие куски кода (более 5 строк) оформляем в тег [more] дабы уменьшить размер поста.

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:52 20-04-2006 | Исправлено: ShIvADeSt, 02:02 30-06-2006
vserd

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

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

 
Ключевой фразой в моем посте является передавать ему метод класса в качестве потоковой функции
Именно метод класса. А не отдельную процедуру. С доступом из этой потоковой функции ко всем внутренностям класса. Я, когда промучавшись до этого с TThread, открыл для себя что можно использовать метод класса для передачи в функции WinAPI, переписал свой модуль,то получил сокращение кода где-то раза в полтора.

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 15:46 12-10-2006
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
Вобще все стоит включая 6hotfix значит возможно еще один баг появился.
Да в общем как мне то лучше бы небыло таких глючных Hint-ов.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 17:07 12-10-2006
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа, помнится, было нечто вроде свойства у компоненты, которое определяет порядок её создания форме. Не напомните?

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 17:49 12-10-2006
RedPromo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TeXpert
Если BDS2006 то меню Edit/Creation Order но только для невизуальных компонентов.

Всего записей: 558 | Зарегистр. 05-04-2006 | Отправлено: 18:03 12-10-2006
webgirlhb

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Помогите, пожалуйста! Ситуация такая.  
К примеру, есть переключатель "Вынесено постановление о назначении дела к слушанию", если он установлен, то панель со информацией об этом постановлении (дата, содержание и проч.) доступна для редактирования.  
DBcheckBox имеет свойство EnableComponent: TControl, которое указывает на панель, содержащую информацию  
 
procedure TfmDoc.FormCreate(Sender: TObject);  
var  
  i: Integer;  
begin  
  for i := 0 to fmDoc.ComponentCount-1 do  
  begin  
    if fmDoc.Components[i].ClassName = 'TRzDBCHECKBoxEnable' then  
    begin  
      if TRzDBCHECKBoxEnable(fmDoc.Components[i]).Checked = false then  
        if TRzDBCHECKBoxEnable(fmDoc.Components[i]).EnableComponent <> nil then  
          TRzDBCHECKBoxEnable(fmDoc.Components[i]).EnableComponent.Enabled := false;  
    end;  
  end;  
end;  
 
вроде ничего сложного, на создание просматриваются все компоненты, и если они относятся к определенному классу, то компонент, на который ссылается свойство EnableComponent дизаблится. (property EnableComponent: TControl, TRzDBCHECKBoxEnable - компонент, наследник DBCheckBox)  
 
проблема в том, что при создании формы выскакивает ошибка Access Violation, причем не всегда, а только иногда , при отладке по шагам вообще все делается как надо, без ошибок (тоже иногда)  
 
 эта ошибка выскакивает обычно при создании первой формы. при создании последующих может не вылезти, однако код просто пропускается. во время отладки свойство Controls[i].ClassName и прочие свойства Controls[i] недоступны (inacessible value), соответственно, оператор if не выполняется, ошибка не выскакивает и полезности тоже никакой

Всего записей: 7 | Зарегистр. 15-08-2006 | Отправлено: 18:08 12-10-2006
Arvur



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

Цитата:
if fmDoc.Components[i].ClassName = 'TRzDBCHECKBoxEnable' then  

Помнится, ClassName к употреблению не рекомендован.  
Я подобные конструкции обычно пишу в виде

Код:
 
if (fmDoc.Components[i] is TRzDBCHECKBoxEnable) then  
  with (fmDoc.Components[i] as TRzDBCHECKBoxEnable) do
 

И AV не получаю

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 18:24 12-10-2006
webgirlhb

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо за ответ. хотя он и не помог, переписала код по вышеприведенной рекомендации, однако ошибка выходит та же самая
 
procedure TfmDoc.FormActivate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to fmDoc.ComponentCount-1 do
  begin
    if fmDoc.Components[i] is TRzDBCHECKBoxEnable then
    begin
      if (fmDoc.Components[i] as TRzDBCHECKBoxEnable).Checked = false then
        if (fmDoc.Components[i] as TRzDBCHECKBoxEnable).EnableComponent <> nil then
          (fmDoc.Components[i] as TRzDBCHECKBoxEnable).EnableComponent.Enabled := false;
    end;
  end;
end;





не создаем новых топиков, когда спросил в одном.

Всего записей: 7 | Зарегистр. 15-08-2006 | Отправлено: 18:37 12-10-2006 | Исправлено: ShIvADeSt, 02:04 13-10-2006
RayZ



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
webgirlhb, не пробовал повесить сие не на FormCreate, а на что нибуть что происходит попозже чуть, чам создание формы?

----------
Think different © Apple | Ростов-на-Борде

Всего записей: 381 | Зарегистр. 10-04-2002 | Отправлено: 19:48 12-10-2006
webgirlhb

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
пробовала. на activate. то же самое

Всего записей: 7 | Зарегистр. 15-08-2006 | Отправлено: 19:52 12-10-2006
RomanTim

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

Цитата:
Ключевой фразой в моем посте является передавать ему метод класса в качестве потоковой функции
Именно метод класса. А не отдельную процедуру. С доступом из этой потоковой функции ко всем внутренностям класса

А какие это все внутренностям класса, к которым может обратится метод класса? Опять же только переменные класса и свойства класса - они существуют в единственном экземпляре и существенно ничем не отличаются от переменных модуля (если не брать вопросы наследования таких классов - сомневаюсь что много людей пишет такие иерархии где активно используются методы класса). Личных же данных потока как не было так и нет.
 
К тому же уйдя от TTread при работе из дочернего потока с визуальными компонентами сразу приходишь к необходимости самостоятельно реализовывать Synchronize - не смертельно конечно, но зачем?
 
webgirlhb
Попробуй более точно определить где выскакивает AccessViolation - по адресу инструкции его вызвавшей. В каком модуле это происходит можно узнать в окне Modules. Если в твоем экзешнике - можно искать где именно, для этого надо приостановить программу, вызвать окно CPU и перейти на адрес. Там на набор ассемблерных инструкций указывается соответствующая строчка исходника (если будет сплошной код - откомпили с отладочными DCU)
 
Ну или в качестве альтернативы можно поставить ту же EurekaLog - и там посмотреть где был эксепшн и стек вызовов

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 20:12 12-10-2006 | Исправлено: RomanTim, 20:23 12-10-2006
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
webgirlhb
Ммм... Попробуй в OnShow засунуть. И проверь у формы свойство OldCreateOrder.

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 20:13 12-10-2006
webgirlhb

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Большое всем спасибо за ответы, с ошибкой разобралась
Почему-то помогло обращение к форме не по имени, а через переменную Self:  
... if Self.Components[i] is TRzDBCHECKBoxEnable then ...

Всего записей: 7 | Зарегистр. 15-08-2006 | Отправлено: 08:13 13-10-2006
vserd

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

Цитата:
А какие это все внутренностям класса, к которым может обратится метод класса? Опять же только переменные класса и свойства класса - они существуют в единственном экземпляре и существенно ничем не отличаются от переменных модуля (если не брать вопросы наследования таких классов - сомневаюсь что много людей пишет такие иерархии где активно используются методы класса). Личных же данных потока как не было так и нет.  
 
К тому же уйдя от TTread при работе из дочернего потока с визуальными компонентами сразу приходишь к необходимости самостоятельно реализовывать Synchronize - не смертельно конечно, но зачем?  

По условиям моей задачи нужно было запускать до трех-пяти потоков. Выполнять нектороые действия. Если делать это через TThread тогда приходилось делать множество телодвижений, которые по моему мнению были излишни. Когда сделал тоже самое через класс, вопервых сократился объем кода, и удалось уйти от бесполезных телодвижений. Так что в моих условиях это было плюсом или двумя плюсами :)))
Работать из потока с визуальными компонентами, IMHO, является злом.

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 10:33 13-10-2006
Arvur



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

Цитата:
передавать ему метод класса в качестве потоковой функции  

Интересная тема... Можешь проиллюстрировать примером кода?  

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 14:43 13-10-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vserd
Ну значит есть задачи где это помогает - у меня вроде все, что сделано в потоках, на TThread хорошо ложится
А зло или нет обращаться к визуальным компонентам - тоже все зависит от задачи. Бывают варианты когда не достаточно PostMessage
 
Arvur

Цитата:
Интересная тема... Можешь проиллюстрировать примером кода?

Все просто - заводишь функцию класса такого вида какой ждет CreateThread и передаешь на нее указатель
Вот простенький пример

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 14:43 13-10-2006 | Исправлено: RomanTim, 14:58 13-10-2006
webgirlhb

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа! Не могли бы вы помочь советом мне с решением определенной задачи, не знаю с чего начинать.
Имеется программное обеспечение, которое устанавливается на некоторое количество компьютеров (20-50), территориально распределенное в пределах области. Необходимо, чтобы каждый пользователь работал на месте только со своими данными (из базы на его локальном компьютере), а примерно раз в сутки подключался к интернету и передавал все свои данные на сервер (подключаясь через модем), где все данные от всех пользователей будут собираться в единую базу данных.
Программное обеспечение уже разработано на базе сервера Interbase, проблема теперь в том, как эти данные переносить? Возможно, есть уже готовые решения, или нужно вручную сверять, каких данных не хватает на главном сервере, и переносить каждую запись из базы отдельно?
Если так, то лучше напрямую подключаться к базе и вносить туда изменения, либо пересылать дамп недостающих записей (в виде инструкций SQL - INSERT). Плюс как-то надо учесть не только недостающие записи, но и обновленные, думаю поможет использование полей типа TIMESTAMP.
Важно то, что на сервере не должна быть копия базы каких-либо клиентов, а именно общая для всех клиентов информация, чтобы можно было в любой момент получить доступ как к обобщенным данным, так и к данным в разрезе определенного клиента.  
Может, здесь необходимо применять к.-либо трехзвенные технологии???
Помогите, откуда подступать, с чего начинать? Буду рада любым идеям, советам

Всего записей: 7 | Зарегистр. 15-08-2006 | Отправлено: 15:36 13-10-2006
RostY



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сделать во всех таблицах поле "Дата модификации". при INSERT, UPDATE писать в него системную дату (программно, или каким-то тригером, с Интербейсом не работал, поэтому не знаю его возможностей). По концу суток делать селект всех записей с сегодняшней "Датой модификации" и бросать не сервер (например, упаковать zip'ом и по ФТП). Как-то отдельно передавать deleted записи. Если в таблицах есть ключи, то на сервере не очень сложно будет это все реплицировать.
Напрямую подлючаться к базе на сервере, наверно, нежелательно, хотя, смотря какое качество связи.

Всего записей: 387 | Зарегистр. 11-01-2006 | Отправлено: 16:47 13-10-2006
OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
webgirlhb
Для начала рекомендую ознакомиться с
http://www.osp.ru/text/302/180723/
http://replication.chat.ru/
Стандартные средства
http://www.ibphoenix.com/main.nfs?a=ibphoenix&s=1064848672:146148&page=ibp_replicator#DOWNLOAD
http://www.meta.com.au/index.php?option=com_content&task=view&id=23&Itemid=30
http://www.microtec.fr/copycat/cc/Support.htm

Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 17:01 13-10-2006
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
webgirlhb
Во-первых, посмотри выше по топику ("Версия для печати"). Тема репликации здесь уже обсуждалась.
В случае IB имеет смысл почитать ibase.ru  
В целом смотришь в правильную сторону - действительно, имеет смысл заводить timestamp поля (либо одно, либо два на создание и изменение) и хранить на клиенте дату-время последнего "сеанса связи".
 
Небольшие комментарии из практического опыта с Firebird:

Цитата:
Как-то отдельно передавать deleted записи.

Лучше заводить флаг-признак удаленности.

Цитата:
Напрямую подлючаться к базе на сервере, наверно, нежелательно

Нормально. Главное, не использовать AutoCommit, а нормально прописать транзакции.

Цитата:
бросать не сервер (например, упаковать zip'ом и по ФТП)

Сэкономить трафик можно, используя прокси. Например ZeBeDee
 

Цитата:
Может, здесь необходимо применять к.-либо трехзвенные технологии???  

Судя по твоему описанию - лесом Это стрельба из пушки по воробьям.
 
И еще момент - некоторые умники советуют вводить "идентификатор рабочего места". Доп. полем или разделять диапазон ключей. Это сильно усложняет код и если нет насущной необходимости - лучше просто перевести ключи на Int64 (если был Int).

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 17:20 13-10-2006
Sexton

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
webgirlhb, думаю, если при проектировании базы изначально не была предусмотрена репликация, то ее туда уже не пришить. Тем более, если базу проектировал кто-то другой. Лучше проектировать новую базу. Но "безумству храбрых поем мы песню".

Цитата:
И еще момент - некоторые умники советуют вводить "идентификатор рабочего места". Доп. полем или разделять диапазон ключей. Это сильно усложняет код и если нет насущной необходимости - лучше просто перевести ключи на Int64 (если был Int).

Не понял. А чем, собственно, поможет перевод на Int64, если не разделить диапазон ключей (то есть, не выделить для каждого места свой диапазон)? Как гарантировать, чтобы одно и то же значение идентификатора записи не повторилось на разных рабочих местах?
Вводить дополнительное поле или нет, конечно, зависит от логики проектировщика. Но тут надо учитывать, что тогда и поля-ссылки придется делать Int64. В конечном итоге это не лучшим способом скажется на производительности. Впрочем, я не интересовался производительностью использования Int64 на 64-битных процессорах. Может, будет быстрее, чем Int32 (в частности, на Firebird)?
К тому же, я, например, помечаю записи идентификатором пользователя (по которому можно определить ID базы), чтобы можно было определить, кто модифицировал запись. Сливать ID пользователя с ID записи для меня было бы сложно и не логично.

Всего записей: 142 | Зарегистр. 31-05-2004 | Отправлено: 04:30 14-10-2006 | Исправлено: Sexton, 04:34 14-10-2006
   

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2
ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru