Да не. Ну как объяснить-то... Вобщем допустим гружу из ресурса эбаут диалог с заголовком блаблабла. Мне нужно поверх этого диалога вывести мессаджбокс или отправить в элемент на этом диалоге какой-то текст. В константу сую текст как раз то что отображается в заголовке эбаут диалога. Но тут приперло локализовать приложение. Локализовать получится только строковые ресурсы, а этот текст остается в теле программы и геморройно потом изменять после компиляции. То есть понятно что если на инглишь допустим перевести заголовок О программе, то About получим и соответсвенно мессаджбокс не появится модально перед эбаут диалогом из-за несовпадения заголовка окна. Как быть?
» Вопросы по Delphi (все версии) - часть 3
Еще раз говорю: когда создаётся диалог, запоминаем его хэндл. И никаких проблем с именами диалогов
Ну дайте код тогда. Я не знаю как вы хэндлы запоминаете... Шаманство...
У меня возникла проблема
Использую компонент TeeChart программно добавляю LineSeries, появляется проблема допустим у одной линии диапазон значений от 0 до 100 а у другой от 300 до 1500 естессно перевую уже не видно, нужно вручную добавить свой Axis... получилось но как-то криво (не правильно расположена) мне нужно чтобы для первой линии Axis был с слева, для второй справа, для третьей вверху и тд.
Подмогните плииз
Использую компонент TeeChart программно добавляю LineSeries, появляется проблема допустим у одной линии диапазон значений от 0 до 100 а у другой от 300 до 1500 естессно перевую уже не видно, нужно вручную добавить свой Axis... получилось но как-то криво (не правильно расположена) мне нужно чтобы для первой линии Axis был с слева, для второй справа, для третьей вверху и тд.
Подмогните плииз
использую D7, для работы с IB попробовал TIBClientDataSet, заполнил его sql-выражением типа
select * from table
связал его с гридом и запустив программу, заполнил грид вручную.
однако при выполении в коде команд
IBClientDataSet.ApplyUpdates(-1);
IBTransaction.Commit;
измененея, сделанные в гриде, в БД не сохраняются (никаких exceptions не вываливается, всё проходит тихо)
что делаю не так?
есть ли где в сети _работающие_ примеры с исходными текстами по использованию TIBClientDataSet? - хотя бы в приведенной выше минимальной функциональности
select * from table
связал его с гридом и запустив программу, заполнил грид вручную.
однако при выполении в коде команд
IBClientDataSet.ApplyUpdates(-1);
IBTransaction.Commit;
измененея, сделанные в гриде, в БД не сохраняются (никаких exceptions не вываливается, всё проходит тихо)
что делаю не так?
есть ли где в сети _работающие_ примеры с исходными текстами по использованию TIBClientDataSet? - хотя бы в приведенной выше минимальной функциональности
Цитата:
То есть мне нужно точно знать хэндл, надо которым помещать сообщение. У меня таких мессаджбоксов в приложении больше 20 штук и некоторые должны отображаться поверх определенных диалогов.
А почему нельзя использовать getfocus?
Ситуация.
на форме для TEdit имеется обработчик OnChange
в D7 приложение работает корректно
а в D2007 если OnChange отрабтает, то после закрытии формы обрабатывается вновь, вызывая ошибку.
Посоветуйте, как ее ликвидировать или
в этом и есть принципиальное отличие D7 от D2007 ???
на форме для TEdit имеется обработчик OnChange
в D7 приложение работает корректно
а в D2007 если OnChange отрабтает, то после закрытии формы обрабатывается вновь, вызывая ошибку.
Посоветуйте, как ее ликвидировать или
в этом и есть принципиальное отличие D7 от D2007 ???
rs
Тебе нужен TIBDataset
Книга мир interbase есть у тебя? там это хорошо описано.
Добавлено:
Она в сети есть. ищи. авторы Ковязин, Востриков
Добавлено:
Ладно, я тебе в пм главу кинул.
Тебе нужен TIBDataset
Книга мир interbase есть у тебя? там это хорошо описано.
Добавлено:
Она в сети есть. ищи. авторы Ковязин, Востриков
Добавлено:
Ладно, я тебе в пм главу кинул.
Maks150988
Что есть хэндл? это просто 4байтовое целое. Кто мешает обявить переменную типа hwnd?
Что есть хэндл? это просто 4байтовое целое. Кто мешает обявить переменную типа hwnd?
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;
Как избавиться от константы?
А как правильно объявить? Использую
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;
Как избавиться от константы?
Maks150988
var s:string;
...
hWnd := FindWindow(nil, PChar(s));
var s:string;
...
hWnd := FindWindow(nil, PChar(s));
lavren
ох блин спасибо. что-то я не додумался... блин...
ох блин спасибо. что-то я не додумался... блин...
Люди подскажите...
В D2007 в OnKeyDown событии любого контрола нажатие Enter не ловица, а комбинация Ctrl+Enter отлавливается как Enter.
Как быть?
В D2007 в OnKeyDown событии любого контрола нажатие Enter не ловица, а комбинация Ctrl+Enter отлавливается как Enter.
Как быть?
Спаибо за интересную информацию
AntonVA1
большое спасибо, разберусь
--
выяснил, что нужно еще обновить IBX - версию IBX11 нашёл, но оказалось, что для неё требуется SP1 для Delphi7
ссылку на скачивание SP1 для Delphi7 найти пока не удалось.
подскажите, пожалуйста, где SP1 можно взять? желательно прямой линк (или могу принять SP1 аттачем в почте)
tnx
большое спасибо, разберусь
--
выяснил, что нужно еще обновить IBX - версию IBX11 нашёл, но оказалось, что для неё требуется SP1 для Delphi7
ссылку на скачивание SP1 для Delphi7 найти пока не удалось.
подскажите, пожалуйста, где SP1 можно взять? желательно прямой линк (или могу принять SP1 аттачем в почте)
tnx
Maks150988
FindWindow возвращает HWND, LoadIcon возвращает HICON, поэтому будет правильнее так:
Код:
var
hWnd: HWND;
hIcon: HICON;
FindWindow возвращает HWND, LoadIcon возвращает HICON, поэтому будет правильнее так:
Код:
var
hWnd: HWND;
hIcon: HICON;
skinash
спасибо
спасибо
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;
компилятор ругается 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;
Maks150988
Цитата:
Наверно uses Windows надо.
2) Надо подключить манифест. В VCL просто бросить на форму TXPManifest. А в WinAPI надо какой то файлик создать.
Цитата:
А файлик такой:
Код: <?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>
Цитата:
компилятор ругается 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>
skinash
Это все есть. Это когда с формами работаешь, там нормально SpeedButton выглядит. А когда с диалогами работаешь и на WinAPI картинку на кнопку суешь, классический стиль почему-то у кнопки. Не знаю почему манифест не применяется к такой кнопке...
Это все есть. Это когда с формами работаешь, там нормально SpeedButton выглядит. А когда с диалогами работаешь и на WinAPI картинку на кнопку суешь, классический стиль почему-то у кнопки. Не знаю почему манифест не применяется к такой кнопке...
Помогите, пожалуйста, прояснить ситуацию.
Создается поток с помощью BeginThread, убивается с помощью EndThread.
Вопрос: должен ли измениться хэндл потока после завершения?
Каким способом можно проверить, что поток действительно завершился?
Создается поток с помощью BeginThread, убивается с помощью EndThread.
Вопрос: должен ли измениться хэндл потока после завершения?
Каким способом можно проверить, что поток действительно завершился?
После завершения потока хэндл уже ни при чём. так как потока нет
Цитата:
Что он правильно завершился?
В конце процедуры потока просто выставляем флажок.
Основной код проверяет флажок. В простейшем случае (один меняет, один читает) синхронизацию можно и не делать. Но в целом, она не помешает. Можно сделать уведомление например на Event'ах Mutex'ах
но убивать поток по собственному желанию крайне не желательно. дело в том, что при убийстве потока его память не освобождается.
Правильный способ - попросить поток об этом. например теми же флажками или Event'ами и Mutex'ами.
Тоесть, выставляется флажок потоку, мол пора тебе завершаться. поток время от времени проверяет флажок. и обнаружив команду - начинает закруглятся
Цитата:
Каким способом можно проверить, что поток действительно завершился?
Что он правильно завершился?
В конце процедуры потока просто выставляем флажок.
Основной код проверяет флажок. В простейшем случае (один меняет, один читает) синхронизацию можно и не делать. Но в целом, она не помешает. Можно сделать уведомление например на Event'ах Mutex'ах
но убивать поток по собственному желанию крайне не желательно. дело в том, что при убийстве потока его память не освобождается.
Правильный способ - попросить поток об этом. например теми же флажками или Event'ами и Mutex'ами.
Тоесть, выставляется флажок потоку, мол пора тебе завершаться. поток время от времени проверяет флажок. и обнаружив команду - начинает закруглятся
Grande
Перевести сможеш:
BOOL WINAPI GetExitCodeThread(
HANDLE hThread,
LPDWORD lpExitCode
);
Если lpExitCode<>STILL_ACTIVE поток умер!
Перевести сможеш:
BOOL WINAPI GetExitCodeThread(
HANDLE hThread,
LPDWORD lpExitCode
);
Если lpExitCode<>STILL_ACTIVE поток умер!
OdesitVadim
Вы хотите сказать, что нежелательно вызывать EndThread в теле потока?
Добавлено:
lavren
Хм... Спасибо. Сейчас запробую...
Вы хотите сказать, что нежелательно вызывать EndThread в теле потока?
Добавлено:
lavren
Хм... Спасибо. Сейчас запробую...
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;
Я приблизительно вот так завершаю поток:
Код: 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;
Цитата:
Вы хотите сказать, что нежелательно вызывать EndThread в теле потока?
Естественно! Самый лучий вариант когда он сам завершиться!
skinash
Я делал нечто подобное:
while not (WaitForSingleObject(Sample, INFINITE) = WAIT_OBJECT_0) do ProcessMessagesEx;
ShowMessage('Поток завершен');
Но уж очень быстро получал сообщение о завершении потока, а потому и закрались сомнения.
Добавлено:
lavren
Имеется в виду, что поток завершится, когда код внутри него исполнится и нет необходимости его завершать принудительно?
Я делал нечто подобное:
while not (WaitForSingleObject(Sample, INFINITE) = WAIT_OBJECT_0) do ProcessMessagesEx;
ShowMessage('Поток завершен');
Но уж очень быстро получал сообщение о завершении потока, а потому и закрались сомнения.
Добавлено:
lavren
Имеется в виду, что поток завершится, когда код внутри него исполнится и нет необходимости его завершать принудительно?
Grande
Да! По этому поводу хорошо написано в книге Дж. Рихтера.
Да! По этому поводу хорошо написано в книге Дж. Рихтера.
lavren
Спасибо, многое прояснилось. С меня
Спасибо, многое прояснилось. С меня
Grande
Цитата:
Здесь вообще-то нужно делать
либо цикл с ProcessMessages и как написал lavren проверкой GetExitCodeThread
либо сделать WaitForSingleObject(поток, INFINITE), но эта функция затормозит основной поток случае пока дочерний поток не завершится, и приложение ничего делать не сможет
Цитата:
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, истории становления российского интернета. Сделано для людей.