Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2004-03-30

Re: Формы

Здравствуйте, Rio.

Вы писали 30 марта 2004 г., 8:30:43:

R> Как узнать какие формы созданы в приложении?
R> Как узнать создана ли определённая форма или нет?
Условием
If Assigned(TForm1) then
ShowMessage('Форма TForm1 создана')
else
ShowMessage('Форма TForm1 НЕ создана');

Если компонент создан, тогда возвращает TRUE.

R> И ещё, есть компонент который есть на всех формах, как лучше к нему обратиться:
R> form1.component1.a:=1;
R> form2.component1.a:=1;
R> ...
R> form10.component1.a:=1;

R> как оптимизировать?
ИМХО, никак. Только через родителя, т.е. форму.

--
С уважением,
Feniks mailto: feni***@b*****.ua
Номер выпуска : 2738
Возраст листа : 190 (дней)
Количество подписчиков : 382
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/115119
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

   Feniks 2004-03-30 22:53:56 (#115119)

Формы

Доброе утро, день, вечер, ночь (ненужное затереть) !!!
ЗЕ МЫШЬ 2.04.7 нашептал что сейчас: 9:28:49, 30 марта 2004 г.,
и я хочу тебе написать следующее:

Как узнать какие формы созданы в приложении?
Как узнать создана ли определённая форма или нет?
И ещё, есть компонент который есть на всех формах, как лучше к нему обратиться:
form1.component1.a:=1;
form2.component1.a:=1;
...
form10.component1.a:=1;

как оптимизировать?

   Rio 2004-03-30 17:14:05 (#115055)

добавление пунктов в попап меню [Delphi6]

Здравствуйте!
Проблема заключается в следующем: подскажите как добавлять пункты меню
в попап меню(но не в конец или начало, а в суюменю) по ходу выполнения программы,
то есть динамически.
Желательно кусочек кода.
Буду очень благодарен за помощь.

   2004-03-30 16:20:07 (#115016)

Re[4]: Registry.DeleteKey

F>> Вот рабочий код на удаление ключа относительно твоего примера.
F>> И ОБСАЛЮТНО НЕ ВАЖНО, ЕСТЬ ЛИ У ЭТОТ КЛЮЧА ПОДКЛЮЧИ И/ИЛИ ПАРАМЕТРЫ.
LV> тем не менее, проблема была в том, что не удаляется непустой ключ.
LV> Сделала, как посоветовал Болюба Георгий, удаляя с нижнего элемента.
> Самое интересное, что я откатал пример без рекурсии у себя на работе
> на 3-х тачках. Работает на 1-й :) С рекурсией работает на всех :).
>
> ИМХО мистика...
>
Не хотелось захламлять лист, но погода что-ли располагает :).

1. ключ не удаляется, если он кем-то открыт - это естественно
2. на Win95/98 функция RegDeleteKey может удалить
ключ с подключами, а на Win NT/2000/... не
может (см. документацию)
3. ключ не удаляется, если на это нет прав, но это почти
наверняка не имеет места в аналогичных случаях
4. TRegistry.DeleteKey, по крайней мере, начиная с
Delphi 3.02, удаляет ключи рекурсивно и,
как следствие, работает на любой
платформе

Объяснить, почему у автора вопроса TRegistry.DeleteKey
сработала только при явном использовании
рекурсии, я не могу.

--
Номер выпуска : 2735
Возраст листа : 190 (дней)
Количество подписчиков : 382
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/115008
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

   2004-03-30 16:05:59 (#115008)

Re[3]: Registry.DeleteKey

Здравствуйте.

LV> ...скип...
F>> Вот рабочий код на удаление ключа относительно твоего примера.
F>> И ОБСАЛЮТНО НЕ ВАЖНО, ЕСТЬ ЛИ У ЭТОТ КЛЮЧА ПОДКЛЮЧИ И/ИЛИ ПАРАМЕТРЫ.

LV> тем не менее, проблема была в том, что не удаляется непустой ключ.
LV> Сделала, как посоветовал Болюба Георгий, удаляя с нижнего элемента.

Самое интересное, что я откатал пример без рекурсии у себя на работе
на 3-х тачках. Работает на 1-й :) С рекурсией работает на всех :).

ИМХО мистика...

   Болюба Георгий 2004-03-30 15:41:27 (#114992)

Re[2]: Registry.DeleteKey

Hello Feniks,

Tuesday, March 30, 2004, 3:01:49 PM, you wrote:

всем большое спасибо за помощь и отзывчивость:)
Все заработало.

...скип...
F> У меня все работает !!!!

F> Из твоего примера не ясно от кула ты берешь Registry ???
F> Это у тебя модуль или переменная. Если этим ты хочешь сказать, что что
Я привела только кусок кода. Redistry - это глобальная переменная.
Естественно, я ее создавала, не стала только приводить этого в письме.
...скип...
F> Вот рабочий код на удаление ключа относительно твоего примера.
F> И ОБСАЛЮТНО НЕ ВАЖНО, ЕСТЬ ЛИ У ЭТОТ КЛЮЧА ПОДКЛЮЧИ И/ИЛИ ПАРАМЕТРЫ.

тем не менее, проблема была в том, что не удаляется непустой ключ.
Сделала, как посоветовал Болюба Георгий, удаляя с нижнего элемента.

...скип...

F> Удачи... :-)
и вам:)

   2004-03-30 15:08:19 (#114965)

Re: Registry.DeleteKey

Здравствуйте, Lilya.

Вы писали 29 марта 2004 г., 9:17:55:

LV> Hello comp,

LV> Необходимо полностью удалить ключ реестра. Следующий код отрабатывает
LV> без ошибок, но результат сабжа=false. Подскажите, в чем ошибка

LV> function DeleteRegistryKeySh(RootKey: HKEY; RegKeyName: string):boolean;
LV> begin
LV> Registry.RootKey:=RootKey;
LV> Registry.OpenKey(RegKeyName, False);
LV> Result:=Registry.DeleteKey(RegKeyName);
LV> // Registry.DeleteValue(RegKeyName); также не удаляет значение ключа.
LV> Registry.CloseKey;
LV> end;

LV> begin
LV> ...
LV> DeleteRegistryKeySh(HKEY_CURRENT_USER, 'Software\MyProgram');
LV> ...
LV> end;

У меня все работает !!!!

Из твоего примера не ясно от кула ты берешь Registry ???
Это у тебя модуль или переменная. Если этим ты хочешь сказать, что что
модуль, то ты не права. Т.к. для работы с реестром так не делается.
Сначала надо в USES-е подключить этот модуль Registry.
Затем описать переменную типа ТRegistry, наприме MyReg : ТRegistry
Если эта переменная нужна только в одной функции, значит там ее и
описывай, если же ты планируешь работать с реестром в всей проге,
тогда надо глобально описывать.
Далее тебе надо ее один раз покритать, например при старте программы в
OnCreate. И не забыть ее удалить при закрытии программы или если она
тебе больше не нужна.
Вот рабочий код на удаление ключа относительно твоего примера.
И ОБСАЛЮТНО НЕ ВАЖНО, ЕСТЬ ЛИ У ЭТОТ КЛЮЧА ПОДКЛЮЧИ И/ИЛИ ПАРАМЕТРЫ.
Функция DeleteKey удаляет весь
указанный ключ со всем его содержимым. Кстати, при этом надо
учитывать права доступа к реестру и к твоим ключам, т.к. в NT-шке (NT
4.0/2000/XP/2003) устанавливается уровень доступа пользователей как ко
всему реестру, так и к отдельным его ключам.

function DeleteRegistryKeySh(RootKey: HKEY; RegKeyName: string):boolean;
var
Reg : TRegistry;
Res : boolean;

begin
Reg := TRegistry.Create;
Reg.RootKey := RootKey;
Res := Reg.DeleteKey('Software\Тут может буть "русский текст в
кавычках"\Naladka');
// Res := Reg.DeleteKey(RegKeyName);
Reg.Free;
end.

LV> begin
LV> ...
LV> DeleteRegistryKeySh(HKEY_CURRENT_USER, 'Software\MyProgram');
LV> ...
LV> end;

В результате в переменную Res будет записан результат выполнения
удаления, т.е. TRUE.

Удачи... :-)

--
С уважением,
Feniks mailto: feni***@b*****.ua
Номер выпуска : 2732
Возраст листа : 190 (дней)
Количество подписчиков : 382
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/114884
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

   Feniks 2004-03-30 13:09:30 (#114884)

Re[3]: Registry.DeleteKey

Здравствуйте, Лилия.

>>> Необходимо полностью удалить ключ реестра. Следующий код отрабатывает
>>> без ошибок, но результат сабжа=false. Подскажите, в чем ошибка
>>>
>>> function DeleteRegistryKeySh(RootKey: HKEY; RegKeyName: string):boolean;
>>> begin
>>> Registry.RootKey:=RootKey;
>>> Registry.OpenKey(RegKeyName, False);
>>> Result:=Registry.DeleteKey(RegKeyName);
>>> Registry.CloseKey;
>>> end;
>>>
ЕА>> Пара OpenKey/CloseKey не нужна. Убери и все заработает.

LV> Убрала. Не заработало:(

Может быть проблема в том, что ключ не пустой? Тогда нужно рекурсивно
обходить все элементы.
Если не понятно, напишите на личный.

   Болюба Георгий 2004-03-30 10:13:56 (#114752)

Re[3]: Registry.DeleteKey

Здрям!
> >> function DeleteRegistryKeySh(RootKey: HKEY; RegKeyName:
string):boolean;
> >> begin
> >> Registry.RootKey:=RootKey;
> >> Registry.OpenKey(RegKeyName, False);
> >> Result:=Registry.DeleteKey(RegKeyName);
> >> Registry.CloseKey;
> >> end;
> >>

Попробуй вместо RootKey: HKEY передавать в функцию var RootKey:TRegistry;
тогда и строка Registry.RootKey:=RootKey; будет не нужна, возможно именно
здесь "собака и порылась". ))
Второе не понятно какой вид имеет RegKeyName - должно быть
"HKEY_USERS\Softvare\mykey" т.е. полный путь.

С уважением monah
e-mail : janal***@n*****.ru
сайт : http:\\janalex.narod.ru
--
Номер выпуска : 2730
Возраст листа : 190 (дней)
Количество подписчиков : 382
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/114738
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

   2004-03-30 09:40:17 (#114738)

Re[2]: Registry.DeleteKey

Hello Емельянов,

Monday, March 29, 2004, 3:17:48 PM, you wrote:

>> Необходимо полностью удалить ключ реестра. Следующий код отрабатывает
>> без ошибок, но результат сабжа=false. Подскажите, в чем ошибка
>>
>> function DeleteRegistryKeySh(RootKey: HKEY; RegKeyName: string):boolean;
>> begin
>> Registry.RootKey:=RootKey;
>> Registry.OpenKey(RegKeyName, False);
>> Result:=Registry.DeleteKey(RegKeyName);
>> Registry.CloseKey;
>> end;
>>
ЕА> Пара OpenKey/CloseKey не нужна. Убери и все заработает.

Убрала. Не заработало:(

   2004-03-30 06:03:22 (#114663)

Re[2]: (CMyObject ) a = (CMyObject *) b

Д>> ДОпустим есть:
Д>> CMyObject a, *b;
Д>> b = new CMyObject;
Д>> Как сделать что то типа(сам знаю что такое не работает, потому и
Д>> говорю что "типа")

Д>> delete (*)a;
Д>> a = *b;
Д>> изврат, да?

я так понял, что нужно удалить содержимое a (по сути вызвать
деструктор) и создать новое содержимое на основе b. Т.е. копирование
данных из одного обеъкта в другой. дальнейшее будет основываться
на этой догадке :)

Y> Статические переменные создаються автоматически как только попадают в
Y> область видимости (наприм. запускается функция её содержащая). Причём
Y> создаёться такая переменная как правило в стеке. Удалять её нельзя.
Y> Присваивать ей другие значения можно только копированием в неё данных.

Y> Выражение a = *b (утверждать не буду) но вроде сработает только если
Y> переопределишь в классе CMyObject оператор =. Ведь тут необходимо
Y> переместить все данные (физически) из области на которую указывает b в
Y> переменную а (в стек).

Yurij прав на все 100%. delete (*a) полная бессмыслица.
Основываясь на догадке, предположу, что это такой способ вызова
деструктора, чтобы "очистить" объект. В общем-то не очень понятно
зачем оно нужно, если идея состоит в копировании объектов. Всё равно
при (полном!) копировании все данные заменятся.

Со вторым выражением есть варианты.
1) в классе MyObject не выделяется память из кучи для данных.
В это случае a=*b сработает на ура без лишних телодвижений.

2) в классе MyObject выделяется память из кучи. например под массивы.
a=*b тоже сработает :) правда все указатели, смотрящие в кучу, будут
смотреть на один и тот же адрес. что в a, что в b. После удаления
объекта b, при попытке доступа к массиву из a, получаем ошибку.
Для таких классов нужно писать методы копирования. Как минимум нужен
конструктор копирования. А для удобства и какой-либо явный метод
(переопределённый оператор "=" или простой метод, например copy()),
чтобы копировать уже существующие объекты.

Д>> А зато как бы было все замечательно.......
В свете вышесказанного и так все шоколадно ;)

   Ivan Mikheikin 2004-03-30 01:10:39 (#114610)