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

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

Автор: ShIvADeSt
Дата сообщения: 28.06.2009 01:09
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 4

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

Правила топика:
Прежде чем спрашивать:
Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
Желательно указывать версии используемого компилятора и операционной системы.
Прежде чем отвечать:
Если не можете помочь, не мешайте.
Если уж вы отвечаете на вопрос, давайте ответ по сути.
Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
Задавайте дополнительные вопросы, чтобы получить больше информации.
Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.
Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].
Некоторые "родственные" топики:
Вопросы по Delphi (версии 2009-2010 Weaver)
Вопросы по компонентам для Delphi, C++ Builder
Использование DevExpress
Вопросы по Ehlib
Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
Коммерческие компоненты и утилиты для Delphi/BCB
Прикладное программирование и не только...
См. также: [more=Некоторые полезные ресурсы о Delphi]
Королевство Delphi
DRKB (Delphi Russian Knowledge Base) & DRKB Explorer
Torry's Delphi Pages
Pascal.Sources.Ru - Паскальные исходники со всего света
Delphi Plus - ежедневные новости информационных технологий[/more]
Автор: Aleksandr_N
Дата сообщения: 28.06.2009 13:38
Продублирую здесь.
Для блокировки прорисовки клиентской области родительской формы в MDI приложении использую конструкцию:

WindowLocked := LockWindowUpdate(ClientHandle);
try
Child := TEditForm.Create(Application);
......
finally
if WindowLocked then
LockWindowUpdate(0);
Repaint;
end;

Но при этом блокировка происходит странно. В клиентской области всё-же прорисовывается рамка дочерней формы, затем прорисовка блокируется, затем появляется уже дочерняя форма.
Вопрос:
Как можно сделать чтобы в клиентской области ничего не происходило до момента полной загрузки дочерней формы (не прорисовывалась рамка дочерней формы)?
Автор: Maks150988
Дата сообщения: 29.06.2009 02:47
Aleksandr_N

Возможно подойдет:

Код: SendMessage(Handle, WM_SETREDRAW, Integer(FALSE), 0);
Автор: Aleksandr_N
Дата сообщения: 29.06.2009 11:00
Maks150988
В связи с перерывом в работе форума не успел дописать, что использование WM_SETREDRAW не подходит т.к. при этом используемые панели TBX на основе Toolbar2000 начинают по непонятной причине лихорадочно дёргаться.

Цитата:
помимо LockWindowUpdate

попробуй вспомнить на досуге, я что-то не нашёл.
Автор: delover
Дата сообщения: 29.06.2009 13:27
Kursist
Продублирую:

Цитата:
Ну, если он не может разобраться даже в моем коде, а ему надо дешево, надежно и сердито, тогда ему прямой путь к обычному калькулятору. Чем плох такой вариант? Но это уже не относится к теме - "Вопросы по Дельфи"!!!

Хочу заметить, что некоторые вещи лучше не делать самостоятельно, ибо даже "Вопросы по Дельфи" очень широкий набор специальных знаний - специализаций. Я бы калькулятор не отважился написать.
Автор: ShIvADeSt
Дата сообщения: 29.06.2009 13:49
Aleksandr_N

Цитата:
В связи с перерывом в работе форума не успел дописать, что использование WM_SETREDRAW не подходит т.к. при этом используемые панели TBX на основе Toolbar2000 начинают по непонятной причине лихорадочно дёргаться.

Погугли немного, может быть подойдет - вобщем окно делают минимизированным(может и не надо) и перемещают далеко за пределы родительского окна. После отрисовок (создания) возвращают на прежнее место.
Во всех остальных случаях только WM_SETREDRAW видел.
Вот тут кое что возможно поможет, другие хэндлы юзаются
http://forum.vingrad.ru/forum/topic-123328.html
Автор: Frodo_Torbins
Дата сообщения: 29.06.2009 14:49
Aleksandr_N
А кому вы WM_SETREDRAW посылаете? Надо его посылать самой MDI-области, то есть ClientHandle.
ShIvADeSt
А можно описание темы немного поправить:
Цитата:
Общие вопросы по дельфи, не связанные с узкой направленность
Автор: Aleksandr_N
Дата сообщения: 29.06.2009 16:16
ShIvADeSt
Оригинальный способ, поищу, а

Цитата:
http://forum.vingrad.ru/forum/topic-123328.html

возможно и прокатит.
Frodo_Torbins
WM_SETREDRAW естественно посылаю родительской форме. В данном случае это не главное по вышеуказанной причине.
Автор: Maks150988
Дата сообщения: 30.06.2009 00:50
Aleksandr_N
Да что-то не получается найти. Я тогда случайно набрел на какой-то забугорный форум. =)

Может кто поможет перевести вот этот код

MenuBarXP

для проекта

iemenurebar3.rar

Что еще за g_pMenuBar в функции MenuInputFilter
Автор: ShIvADeSt
Дата сообщения: 30.06.2009 03:53
Frodo_Torbins

Цитата:
А можно описание темы немного поправить:
Цитата:
Общие вопросы по дельфи, не связанные с узкой направленность

Неа, число символов ограничено
Автор: Aleksandr_N
Дата сообщения: 30.06.2009 10:41
Maks150988
Ладно, спасибо за труды. Попробую как-нибудь выкрутиться.
Автор: ShIvADeSt
Дата сообщения: 30.06.2009 10:52

Цитата:
Что еще за g_pMenuBar в функции MenuInputFilter

Это вот эта фигня
# CMenuBarXP* g_pMenuBar = NULL;
судя по всему хэндл класса CMenuBarXP.
Автор: Maks150988
Дата сообщения: 30.06.2009 11:48
ShIvADeSt
Понятно. Все еще не теряю надежды в создании меню на ребаре. Смотрел исходный код Windows 2000, а именно Explorer и Internet Explorer и толком не нашел ничего, там вообще все на взаимодействии интерфейсов чтоли, ахтунг сплошной. И MSDN походу врет насчет стилей контролов - там некоторые вообще не используются. А ловушку для отлова показа меню так вообще непонятно где искать.
Я вот все доделываю контрол гиперссылки и все интересно узнать как самому у себя в контроле отлавливать сообщение от WM_COMMAND. Ну что-то типа от обычной кнопки мы обрабатываем так:


Код: WM_COMMAND:
begin
if (HiWord(wParam) = BN_CLICKED) then
begin
case LoWord(wParam) of
идентификатор:
действие;
end;
end;
end;
Автор: ShIvADeSt
Дата сообщения: 30.06.2009 12:09
Maks150988
Явно вопрос не в типовых вопросах по Дельфи. Предложение - создай отдельную тему типа создание класса (или контрола) на чистом АПИ на дельфи. Там будешь выкладывать сорсы, а кто может - подсказывать. Просто в данном топике твои посты немного не в тему и убегают быстро. Я уже пару раз готов был создать свой контрол от баттона с оунердро стилем, щас конец начало месяца пройдет - думаю займусь. И еще, есть у меня один исходник, я его тебе вроде давал. Там создается класс меню на АПИ и как раз внутри него все события ловятся. Я там думаю надо оттуда отталкиваться. В общем создавай тему - будем пробывать.
Автор: Maks150988
Дата сообщения: 30.06.2009 14:26
ShIvADeSt
Сорри, все, нашел. В функции контрола делаем так:

Код: WM_LBUTTONUP:
begin
ReleaseCapture;
SendMessage(hWnd, WM_KILLFOCUS, 0, 0);
SendMessage(GetParent(hWnd), WM_COMMAND, GetDlgCtrlID(hWnd), 0);
end;
Автор: IndII
Дата сообщения: 30.06.2009 15:41
Здравствуйте!
Все никак не могу разобраться с этими деструкторами в Delphi... Надеюсь на вашу помощь...
Есть несколько вопросов:
1. Что делает метод Free? Как я понимаю, он вызывает деструктор, но кроме этого что-то еще... а что именно до меня не доходит...
2. Вопрос уже по самим деструкторам...
Допустим есть класс:

Код: Test = class
Label1 : TLabel;
tst : string;

constructor Create;
destructor Destroy; override;
end;
Автор: delover
Дата сообщения: 30.06.2009 16:41
IndII
1. Метод Tst.Free; заменяет конструкцию типа:
> if ( Tst<>nil ) then Tst.Destroy;
Писать Free получается короче.

2. Объект удалился совсем, это точно. Но переменная Tst будет иметь то же самое значение, так как она будет указывать на кусок освобождённой памяти. Эту память ранее занимал объект класса Test. По нормальному inherited Destroy; надо писать всегда. Так как через пол года кто-нибудь может просто дописать:
> Test = class ( TForm )
Да и в dotNet без inherited; нельзя.

ps
Вот бы калькулятор со скобками и не позволяющий вводить лишнюю закрывающую скобку. )
Автор: IndII
Дата сообщения: 30.06.2009 16:59
delover
Ясно, большое спасибо...

И появилась еще одна проблемка... В одном проекте есть две формы. Вторая показывается как модальное окно при клике, допустим на кнопку первой формы.
Нужно, что бы при закрытии второй формы, первая обновилась (метод Refresh). Вроде бы просто, а как сделать не могу понять
Пробывал просто прописать при клике на кнопку первой формы формы:

Код: Forma2.ShowModal;
Refresh;
Автор: volser
Дата сообщения: 30.06.2009 21:10
IndII

Что значить обновилась? Перерисовалась или что бы обновились какие то данные?
Автор: gogaman
Дата сообщения: 30.06.2009 21:17
volser
а если мне к примеру надо 2 сохранить и токо 1 запустить
пробывал по анологии не получаеться сохраняет файлы с размером последнего сохраненого
при некоторых манипуляциях ругаеться на некий поинтер
Автор: IndII
Дата сообщения: 30.06.2009 21:26
volser
Ну, в идеале, нужно что бы при закрытии второй формы, сработал метод при событии onActivate (по умолчанию дельфа обзывает его FormActivate) для первой.
Автор: volser
Дата сообщения: 30.06.2009 21:33
IndII

Можно вручную вызвать метод FormActivate() задав нужные параметры. Но правильнее сделать отдельный метод который вызывать в методе FormActivate(), а также после закрытия второй формы.
Автор: VandB
Дата сообщения: 30.06.2009 23:17
А еще есть сайты кроме _ttp://torry.net/ с компанентами?
Автор: Frodo_Torbins
Дата сообщения: 01.07.2009 12:50
IndII
Цитата:
И как вызывать этот мой деструктор? Если просто Free, то потом обращение к полю tst не вызовет никаких ошибок, то есть, как я понимаю, объект не совсем удалился...)
Чтобы не было такой путаницы рекомендуют всегда вместо конструкции Label1.Free писать FreeAndNil(Label1). Такой метод не имеет никаких недостатков (кроме необходимости создать специальный темплейт в среде), но зато может подстраховать при ошибочном обращении к удаленному объекту.

VandB
Полно, в гугле наберите "Delphi components".
Автор: Cryogen2003
Дата сообщения: 01.07.2009 16:40
Итак, дублирую пост из предыдущий части.

Добрый день.
Появилась проблема, на работе расширили список пользователей моего софта, но у них всех стоит OpenOffice и стало быть мой самописный в свое время компонент экспорта в excel не работает. Как быстро переписать так, чтобы у всех пользователей экспорт работал и было без разницы, стоит Microsoft Excel или OpenOffice.

Если понадобиться, то могу выложить исходник, который надо поправить для этого.
Как бы можно конечно сделать, чтобы создавать файл xls, минуя Microsoft Excel, но у большинства пользователей прав нет на создание и запись файлов совсем.
Автор: volser
Дата сообщения: 01.07.2009 16:45
Cryogen2003

Цитата:
но у большинства пользователей прав нет на создание и запись файлов совсем.


Как это нет прав на создание файлов? Даже в папку "Мои документы"?
Автор: spasius
Дата сообщения: 01.07.2009 21:28
Cryogen2003
есть пакеты компонент для Дельфи предназначенные для импорта и экспорта БД, обычно в комплекте есть ... xls.
можно попробовать: XLSReadWriteII или TXLSFile.v4.0
Автор: IndII
Дата сообщения: 02.07.2009 09:42
Здравствуйте!
Возникла проблема с Indy в Delphi 2009 (врочем как и в C++Builder 2009).
Пытаюсь реализовать механизм отправки сообщения на e-mail. Использую компоненты TIdSMTP и TIdMessage. Сообщения приходят нормально, но в совершенно нечитабельном виде... проблема с кодировкой. Два часа в гугле ничего не дали...
Мой код:
[more]
Код: IdSMTP.Host := '...';
IdSMTP.Port := 25;
IdSMTP.Username := '...';
IdSMTP.Password := '...';
IdSMTP.Connect();

IdMessage.Body.Add('Привет)');
IdMessage.CharSet := 'windows-1251';
IdMessage.ContentTransferEncoding := '8bit';
IdMessage.ContentType := 'text/plain';
IdMessage.Subject := 'Привет)';
IdMessage.From.Text :='...';
IdMessage.Recipients.EMailAddresses := '...';

IdSMTP.Send(IdMessage);
Автор: mdid
Дата сообщения: 02.07.2009 11:15
to IndII
я бы советовал бежать от Indy так быстро как можете...с кодировкой(и не только) у них всегда было до ужаса туговато...если в 9 инди я где то читал можно было добавить пару строк для коррекции то для 10 я ничего не нашел...погуглите на тему альтернативных компонентов
ПС
и свой вопрос
нужно для своих целей создать коннект для 1С базы..все сделал все работает...но не работает освобождение переменной

Код: Ole1C : OleVariant;
Автор: IndII
Дата сообщения: 02.07.2009 12:08
mdid
ммм... хотелось бы все же разобраться с инди... по моему это самый простой способ отправки e-mail'ов если бы не баги... в гугле нашел, что еще можно сделать через mapi, но пока не разобрался с этим...

PS а есть ли возможность в CodeGear 2009 откатить версию инди? В Delphi 7 c indy 10.0 с чем-то там все нормально работает...

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


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