Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 6

Автор: akaGM
Дата сообщения: 07.06.2012 12:58
Grande
а что ты хочешь сотворить-то?
Автор: Grande
Дата сообщения: 07.06.2012 14:01

Цитата:
а что ты хочешь сотворить-то?

У меня куча форм, создающихся в run-time, а посему я хочу сотворить кое-какие действия в OnCreate.
Автор: XPerformer
Дата сообщения: 07.06.2012 14:41
Grande
используй AfterConstruction
Автор: mdid
Дата сообщения: 07.06.2012 14:47
Grande

Цитата:
У меня куча форм, создающихся в run-time, а посему я хочу сотворить кое-какие действия в OnCreate.

а вам не кажется что это не удачная затея...хорошим тоном считается создавать форму тогда когда она надо а не все что есть в наличии и сразу...я конечно не знаю задачи..но все же
Автор: Grande
Дата сообщения: 07.06.2012 15:05

Цитата:
используй AfterConstruction

Спасибо, сделал


Цитата:
а вам не кажется что это не удачная затея...хорошим тоном считается создавать форму тогда когда она надо а не все что есть в наличии и сразу...я конечно не знаю задачи..но все же

Так я их и создаю по мере надобности
Автор: akaGM
Дата сообщения: 07.06.2012 15:15
Grande
что-то с логикой не того, только я не могу понять что...

procedure TfrmServer.FormActivate(Sender: TObject);
begin
frmFrame := TfrmFrame.Create(Self);
frmFrame.Parent := Self;
// frmFrame.OnCreate := frmFrame.FormCreate;
end;

тебе именно в FormActivate() надо воткнуться?
Автор: Grande
Дата сообщения: 07.06.2012 15:48

Цитата:
тебе именно в FormActivate() надо воткнуться?

Не обязательно: необходимо создать формы frmFrame после создания формы frmServer.
Автор: akaGM
Дата сообщения: 07.06.2012 16:31
Grande

Код: var
Form1: TForm1;

type
TMyForm = TForm;

var
MyForm : TMyForm;

procedure TForm1.FormCreate(Sender: TObject);
begin
MyForm := TMyForm.Create(Self);
MyForm.Parent := Self;
MyForm.Top := 50;
MyForm.Left := 50;
MyForm.Caption := 'Test';
MyForm.Color := clRed;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
MyForm.Show;
end;
Автор: Grande
Дата сообщения: 08.06.2012 06:28
akaGM
Это понятно. Меня интересовало, почему не срабатывало событие OnCreate формы frmFrame.
Что-то я стормозил По-моему, OnActivate будет срабатывать всякий раз при получении фокуса ввода...
Надо подумать.
Автор: Frodo_Torbins
Дата сообщения: 08.06.2012 16:03
Grande
Если в dfm-ке OnCreate не прописан, то вручную его задавать будет уже слишком поздно. Так что остаются стандартные техники с переопределением методов в наследниках.
Автор: Grande
Дата сообщения: 09.06.2012 07:51
Frodo_Torbins
Ну, в общем-то, я так в конце концов и сделал
Автор: SevereK20
Дата сообщения: 09.06.2012 12:31
Подскажите, пожалуйста... имеется программа на делфи и бд на Firebird 2.5
В программе есть DbGrid, в котором выводятся все записи таблицы. Выводятся стандартно - транзакция-датасет-датасоурс-dbgrid.
Параметры транзакции для вывода следующие:
isc_tpb_read
isc_tpb_read_committed
isc_tpb_nowait
isc_tpb_rec_version

Как сделать так, чтобы при добавлении/измении записи после того как изменения подтверждены(commit) транзакция автоматически обновлялась и были видны новые данные? На данный момент в DBGrid записи обновляется только если закрыть/открыть датасет. Есть идея сделать это через триггер, но по-моему выглядеть это будет тупо и существуют другие методы решения...
Подскажите, пожалуйста..
Автор: ant0ni02004
Дата сообщения: 09.06.2012 21:20
SevereK20
лучше будет делать dataSet.Refresh
многие компоненты доступа к данным это позволяют, в т.ч. обновить отдельно взятую запись
Автор: SevereK20
Дата сообщения: 10.06.2012 01:14

Цитата:
лучше будет делать dataSet.Refresh
многие компоненты доступа к данным это позволяют, в т.ч. обновить отдельно взятую запись

после DataSet.Refresh и DataSet.RefreshSQL все ранво отображаются старые данные......
Автор: ant0ni02004
Дата сообщения: 10.06.2012 02:10
SevereK20
а какие компоненты доступа к данным используются? может не умеют просто
Автор: salexn1
Дата сообщения: 10.06.2012 08:32
SevereK20
Уже было переломано много копий насчет данного вопроса.
Автоматом это не получится, нужно рефрешить по таймеру, но тогда возникает вопрос: как часто? Т.к. при частом рефреше положишь и сервер и сетку. И таких концернов очень много. В итоге идея остается одна - пусть юзер сам рефрешит
Автор: ant0ni02004
Дата сообщения: 10.06.2012 16:54
SevereK20
salexn1
Если речь об таком обновлении - то лучше по таймеру.
Вариант №2 - через триггер event пускать, а на клиентах обновлять по его приходу. Но автоматическое обновление штука сложная, нужно учитывать что юзер может как раз в это время работать с данными и рефреш будет неуместен.
Автор: XPerformer
Дата сообщения: 10.06.2012 21:43
ant0ni02004

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

Наверное, лучше повесить рефреш на OnIdle + проверка на то, что пользователь находится в режиме редактирования + таймер - оптимальный вариант
Хотя кнопка Рефреш на форму устраивает даже неискушенных пользователей, как правило
Автор: SevereK20
Дата сообщения: 10.06.2012 22:04

Цитата:
а какие компоненты доступа к данным используются? может не умеют просто

FIBPlus обычный Dataset..
да, похоже лучшим вариантом будет обновление по таймеру..
Автор: salexn1
Дата сообщения: 10.06.2012 22:25
SevereK20
Нет, не лучший. Скажем Вы выставите обновлять каждую минуту, а то и 30 секунд. За час может не внестись ни одного обновления, а вы со своими юзерами будете дергать N-таблиц просто так... Если количество таблиц, которые нужно рефрешить будет велико - все, абзац серверу и сетке.

Автор: SevereK20
Дата сообщения: 11.06.2012 00:48
salexn1
В базе всего 2 человека работать будут.
Причем данные в самой таблице редактировать будет нельзя.
Т.е. по двойному клику по записе будет открывать окно редактирования заказа. Поэтому ничего смертельного нет. Я думал есть какое-то свойство у DataSet'а... оказывалось, ошибся.
Помозгую еще как лучше будет.. Триггер afterupdate вариант неплохой тоже, его как варинант расцениваю тоже.
Автор: SevereK20
Дата сообщения: 11.06.2012 08:42
Написал ради интереса в поддержку Devrace...если интересно кому, ответили следующее
"1. Нужно использовать обязательно 2 транзакции - одну на только-чтение, другая только-запись (смотрите примеры как).
2. Включить на датасете использование кэша . если этого не сделать, отображать будет, но тогда запоминать позицию курсора нужно ручками, через букмарки.
3. по таймеру делать FullRefresh датасета. (если без кэша, то перед этим запомнить букмарк, а после восстановить).

ПС: Все это есть в примерах. Если у вас не лицензионная версия, то их найти можно на сайте."
Автор: eddoc
Дата сообщения: 11.06.2012 16:34
SevereK20

Цитата:
перед этим запомнить букмарк, а после восстановить


не используйте букмарки, они ненадежны. Запоминайте ПК записи, по ней можно будет восстановить позицию или перейти на предыдущую, если текущая была удалена (дядя Толя Подгорецкий об этом на скруле хорошо написал).
Автор: XPerformer
Дата сообщения: 11.06.2012 22:56
eddoc

Цитата:
не используйте букмарки, они ненадежны.

Чем же они не надежны?
Только в FireBird или вообще?
Автор: SevereK20
Дата сообщения: 12.06.2012 08:57
eddoc
Я наоборот буквально вчера букмарки освоил - очень понравилось - удобно их использовать. Чем они могут быть ненадежны?
Автор: salexn1
Дата сообщения: 12.06.2012 09:56
SevereK20
После Close/Open букмарки будут не валидны, а ID (PK) - всегда останется валидным
Автор: XPerformer
Дата сообщения: 12.06.2012 10:02
salexn1
Ну да, это аргумент
Но не понимаю, как же позиционироваться по ПК, особенно если учесть для отображения в гриде датасет чаще всего отсортирован совсем не по ПК?
Автор: salexn1
Дата сообщения: 12.06.2012 10:08
XPerformer
FindKey или Locate или средствами самого грида (если это cxGrid - DataController.LocateByKey())
Автор: XPerformer
Дата сообщения: 12.06.2012 10:18
Locate все-таки не будем рассматривать (на больших таблицах медленно, а на маленьких и проблемы в принципе нет), но это мелочь...
Для случая не cxGrid : как поможет Findkey выйти на соседнюю запись с удаленной, если датасет не отсортирован по ПК?
(я к тому клоню, что в общем случае полноценной альтернативы букмаркам нету, может, ошибаюсь)
Автор: salexn1
Дата сообщения: 12.06.2012 11:25
XPerformer
нужно придумывать как быть в таких случаях...

Ну а вообще, букмарки - это тру.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.