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

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

Автор: Maks150988
Дата сообщения: 19.09.2007 23:20
Да не. Ну как объяснить-то... Вобщем допустим гружу из ресурса эбаут диалог с заголовком блаблабла. Мне нужно поверх этого диалога вывести мессаджбокс или отправить в элемент на этом диалоге какой-то текст. В константу сую текст как раз то что отображается в заголовке эбаут диалога. Но тут приперло локализовать приложение. Локализовать получится только строковые ресурсы, а этот текст остается в теле программы и геморройно потом изменять после компиляции. То есть понятно что если на инглишь допустим перевести заголовок О программе, то About получим и соответсвенно мессаджбокс не появится модально перед эбаут диалогом из-за несовпадения заголовка окна. Как быть?
Автор: OdesitVadim
Дата сообщения: 19.09.2007 23:35
Еще раз говорю: когда создаётся диалог, запоминаем его хэндл. И никаких проблем с именами диалогов
Автор: Maks150988
Дата сообщения: 20.09.2007 07:41
Ну дайте код тогда. Я не знаю как вы хэндлы запоминаете... Шаманство...
Автор: GimTonik
Дата сообщения: 20.09.2007 07:42
У меня возникла проблема

Использую компонент TeeChart программно добавляю LineSeries, появляется проблема допустим у одной линии диапазон значений от 0 до 100 а у другой от 300 до 1500 естессно перевую уже не видно, нужно вручную добавить свой Axis... получилось но как-то криво (не правильно расположена) мне нужно чтобы для первой линии Axis был с слева, для второй справа, для третьей вверху и тд.

Подмогните плииз
Автор: rs
Дата сообщения: 20.09.2007 07:58
использую D7, для работы с IB попробовал TIBClientDataSet, заполнил его sql-выражением типа
select * from table
связал его с гридом и запустив программу, заполнил грид вручную.
однако при выполении в коде команд
IBClientDataSet.ApplyUpdates(-1);
IBTransaction.Commit;
измененея, сделанные в гриде, в БД не сохраняются (никаких exceptions не вываливается, всё проходит тихо)

что делаю не так?

есть ли где в сети _работающие_ примеры с исходными текстами по использованию TIBClientDataSet? - хотя бы в приведенной выше минимальной функциональности
Автор: vserd
Дата сообщения: 20.09.2007 08:25

Цитата:
То есть мне нужно точно знать хэндл, надо которым помещать сообщение. У меня таких мессаджбоксов в приложении больше 20 штук и некоторые должны отображаться поверх определенных диалогов.

А почему нельзя использовать getfocus?
Автор: George_Lucky
Дата сообщения: 20.09.2007 10:26
Ситуация.
на форме для TEdit имеется обработчик OnChange
в D7 приложение работает корректно
а в D2007 если OnChange отрабтает, то после закрытии формы обрабатывается вновь, вызывая ошибку.
Посоветуйте, как ее ликвидировать или
в этом и есть принципиальное отличие D7 от D2007 ???
Автор: AntonVA1
Дата сообщения: 20.09.2007 11:38
rs
Тебе нужен TIBDataset
Книга мир interbase есть у тебя? там это хорошо описано.

Добавлено:
Она в сети есть. ищи. авторы Ковязин, Востриков

Добавлено:
Ладно, я тебе в пм главу кинул.
Автор: OdesitVadim
Дата сообщения: 20.09.2007 13:53
Maks150988
Что есть хэндл? это просто 4байтовое целое. Кто мешает обявить переменную типа hwnd?
Автор: Maks150988
Дата сообщения: 20.09.2007 15:49
OdesitVadim
А как правильно объявить? Использую
procedure VersionDlgInit;
var
hIcon, hWnd : Integer;
begin
hIcon := LoadIcon(Inst, PChar(MAIN_ICON));
hWnd := FindWindow(nil, 'опять же из константы гружу');
SendMessage(hWnd, WM_SETICON, ICON_SMALL, hIcon);
SendMessage(hWnd, WM_SETICON, ICON_BIG, hIcon);
end;
Как избавиться от константы?
Автор: lavren
Дата сообщения: 20.09.2007 16:14
Maks150988

var s:string;
...
hWnd := FindWindow(nil, PChar(s));
Автор: Maks150988
Дата сообщения: 20.09.2007 16:22
lavren
ох блин спасибо. что-то я не додумался... блин...
Автор: JbBaD
Дата сообщения: 20.09.2007 17:36
Люди подскажите...
В D2007 в OnKeyDown событии любого контрола нажатие Enter не ловица, а комбинация Ctrl+Enter отлавливается как Enter.
Как быть?
Автор: q2q2q2q2q2
Дата сообщения: 20.09.2007 18:40
Спаибо за интересную информацию
Автор: rs
Дата сообщения: 21.09.2007 07:32
AntonVA1
большое спасибо, разберусь

--

выяснил, что нужно еще обновить IBX - версию IBX11 нашёл, но оказалось, что для неё требуется SP1 для Delphi7

ссылку на скачивание SP1 для Delphi7 найти пока не удалось.

подскажите, пожалуйста, где SP1 можно взять? желательно прямой линк (или могу принять SP1 аттачем в почте)

tnx
Автор: skinash
Дата сообщения: 21.09.2007 07:54
Maks150988
FindWindow возвращает HWND, LoadIcon возвращает HICON, поэтому будет правильнее так:

Код:
var
hWnd: HWND;
hIcon: HICON;
Автор: rs
Дата сообщения: 21.09.2007 08:09
skinash
спасибо
Автор: Maks150988
Дата сообщения: 21.09.2007 09:37
skinash
компилятор ругается Constant or type identifier expected.

Есть пара вопросов:
1) Как покрасить кнопку? Собственно код для использования цвета уже есть - покрасил статики и диалог. Это все работает. Но возникла прорблема с покраской кнопки.

Код:
WM_CTLCOLORBTN : begin
case GetDlgCtrlId(lParam) of
BUTTON_PROPERTY:
begin
whitebrush := CreateBrushIndirect(WhiteLB);
SetBkColor(wParam, WhiteLB.lbColor);
result := whitebrush;
end;
end;
Автор: skinash
Дата сообщения: 21.09.2007 10:30
Maks150988

Цитата:
компилятор ругается Constant or type identifier expected.

Наверно uses Windows надо.
2) Надо подключить манифест. В VCL просто бросить на форму TXPManifest. А в WinAPI надо какой то файлик создать.

Цитата:
The manifest is a XML document. It will allow Windows XP to decide which
version of the comctl32.dll to use when binding.
The XML document contains information about the application you are
writing as well as information concerning the version of the comctl32.dll to use.

А файлик такой:

Код: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="CompanyName.ProductName.MyProgram"
type="win32"
/>
<description>Your Application Description</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
Автор: Maks150988
Дата сообщения: 21.09.2007 12:24
skinash
Это все есть. Это когда с формами работаешь, там нормально SpeedButton выглядит. А когда с диалогами работаешь и на WinAPI картинку на кнопку суешь, классический стиль почему-то у кнопки. Не знаю почему манифест не применяется к такой кнопке...
Автор: Grande
Дата сообщения: 21.09.2007 13:29
Помогите, пожалуйста, прояснить ситуацию.
Создается поток с помощью BeginThread, убивается с помощью EndThread.
Вопрос: должен ли измениться хэндл потока после завершения?
Каким способом можно проверить, что поток действительно завершился?
Автор: OdesitVadim
Дата сообщения: 21.09.2007 14:18
После завершения потока хэндл уже ни при чём. так как потока нет

Цитата:
Каким способом можно проверить, что поток действительно завершился?

Что он правильно завершился?
В конце процедуры потока просто выставляем флажок.
Основной код проверяет флажок. В простейшем случае (один меняет, один читает) синхронизацию можно и не делать. Но в целом, она не помешает. Можно сделать уведомление например на Event'ах Mutex'ах
но убивать поток по собственному желанию крайне не желательно. дело в том, что при убийстве потока его память не освобождается.
Правильный способ - попросить поток об этом. например теми же флажками или Event'ами и Mutex'ами.
Тоесть, выставляется флажок потоку, мол пора тебе завершаться. поток время от времени проверяет флажок. и обнаружив команду - начинает закруглятся
Автор: lavren
Дата сообщения: 21.09.2007 14:33
Grande
Перевести сможеш:
BOOL WINAPI GetExitCodeThread(
HANDLE hThread,
LPDWORD lpExitCode
);

Если lpExitCode<>STILL_ACTIVE поток умер!
Автор: Grande
Дата сообщения: 21.09.2007 14:38
OdesitVadim
Вы хотите сказать, что нежелательно вызывать EndThread в теле потока?


Добавлено:
lavren
Хм... Спасибо. Сейчас запробую...
Автор: skinash
Дата сообщения: 21.09.2007 14:42
Grande
Я приблизительно вот так завершаю поток:

Код: procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if Assigned(WriteDataThread) then
begin
if WriteDataThread.Suspended then
WriteDataThread.Resume; // чтобы поток можно было уничтожить
WriteDataThread.Terminate;
WriteDataThread.WaitFor;
WriteDataThread.Free; // чтобы не было утечек памяти, а ещё лучше FreeAndNil()
end;
end;
Автор: lavren
Дата сообщения: 21.09.2007 14:46

Цитата:
Вы хотите сказать, что нежелательно вызывать EndThread в теле потока?

Естественно! Самый лучий вариант когда он сам завершиться!
Автор: Grande
Дата сообщения: 21.09.2007 14:46
skinash
Я делал нечто подобное:

while not (WaitForSingleObject(Sample, INFINITE) = WAIT_OBJECT_0) do ProcessMessagesEx;
ShowMessage('Поток завершен');

Но уж очень быстро получал сообщение о завершении потока, а потому и закрались сомнения.

Добавлено:
lavren
Имеется в виду, что поток завершится, когда код внутри него исполнится и нет необходимости его завершать принудительно?
Автор: lavren
Дата сообщения: 21.09.2007 14:56
Grande
Да! По этому поводу хорошо написано в книге Дж. Рихтера.
Автор: Grande
Дата сообщения: 21.09.2007 15:02
lavren
Спасибо, многое прояснилось. С меня
Автор: RomanTim
Дата сообщения: 21.09.2007 15:11
Grande

Цитата:
while not (WaitForSingleObject(Sample, INFINITE) = WAIT_OBJECT_0) do ProcessMessagesEx;

Здесь вообще-то нужно делать
либо цикл с ProcessMessages и как написал lavren проверкой GetExitCodeThread
либо сделать WaitForSingleObject(поток, INFINITE), но эта функция затормозит основной поток случае пока дочерний поток не завершится, и приложение ничего делать не сможет

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: 1С: Конвертация данных 2.0


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