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

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

Автор: OdesitVadim
Дата сообщения: 28.07.2008 10:55
Narrator

Цитата:
одно и тоже изменение может давать разные эффекты. То есть имеем три разные пути повидения.
Какие изменения и это где-то описано? Ткни, чтоб знал.

до 2007 делфи кнопка на парели задач и главная форма - разные вещи.
Теперь, если в dpr файле есть нужная строка - это связанные вещи, и меняя заголовок формы, автоматом меняем и надпись на кнопке панели задач (наверно все видели, что по умолчанию заголовок формы - Form1, а на панели задач - Project1).
начиная с 2005 делфи и старше, теперь dpr файл не совсем настоящий. точнее не совсем главный. Он генерируется на основании других файлов. И неудачная правка (когда делфи не поняла что же было сделано) приводит к странным результатам.
На одном с форумов человек долго мучился, почему у него не собирается проект, пока ему не обяснили, что править dpr файл надо очень аккуратно.
А вот где это описано... есть, но размазано по сотням хелпов и сорцов. Надо искать и собирать.

Цитата:
Чего ей путаться? В свойствах проекта явно задано какая из форм главная. К тому же она первой в dpr создается.

Ага
На самом деле, главная та форма, которая была первая создана строкой Application.CreateForm. А то что видно в свойствах проекта - результат парсинга. И "хороший хитрый" программист всегда умудриться так написать, что бы свести с ума дефли.
Цитата:
Ну... если следовать этой мысли, то тогда получается, что создание любой формы до Run не гарантированно. Все контролы создаются и работают через виндовые сообщения.

Для создания им сообщения не надо. А вот для работы - а кто мешает самостоятельно слать себе же события? Делфи так сама делает.
Автор: SZap
Дата сообщения: 28.07.2008 11:58
Frodo_Torbins
lerthe61
Ок, спасибо, буду рыть в указанном направлении...
Автор: Kilich
Дата сообщения: 28.07.2008 14:38
Возник вопрос - решить который не могу вот уже несколько дней!
Облазил просторы Инета - пользы сплошной 0.

Необходимо из Длл выплюнуть TDataset c набором данных.
Причем хотелось бы не просто выплюнуть а передать приложению, которое и вызовет из Длл.
Как это сделать?
Автор: OdesitVadim
Дата сообщения: 28.07.2008 16:04
Kilich
лучше так не делать.
Если уж сильно хочеться, то стоит посмотреть в сторону bpl.
Автор: Kilich
Дата сообщения: 28.07.2008 16:35
OdesitVadim
Почему лучше не делать?
Где то находил, но не нашел как - Длл выплюнет в файл содержимое TDataset, а в приложении хотелось бы этот файл втянуть!
Ну же - помогите - существует подобная реализация?!
Автор: OdesitVadim
Дата сообщения: 28.07.2008 17:03
Kilich
Ну через файл можно. никто не мешает сохранить в длл данные, а с основного приложения загрузить этот файл. А вот передавать ссылку на компонент через границу приложение-длл не стоит - проблемы будут.
Автор: mvictor71
Дата сообщения: 28.07.2008 17:17
Kilich
я пробовал нечто подобное для Activex - через Variantarray
Автор: Kilich
Дата сообщения: 28.07.2008 17:49
OdesitVadim
Если возможно - покажите примером как сбросить в файл TDataset?
Автор: Maks150988
Дата сообщения: 28.07.2008 23:13
Помогите разобраться с потоками. Ситуация такая: имеет процедуру/функцию, которую необходимо выполнить в отдельном потоке чтобы программа не висла. Но необходимо выполнить ее так, чтобы не в цикле что-то происходило, а единоразово все это выполнилось, но в потоке. Код урезанный и впринципе все что нужно есть. Принцип работы состоит в том что: запускается поток - в нем исполняется функция по загрузке и сохранению текстового файла на диск - чтение этого файла и дальнейший его парсинг - удаление файла после парсинга чтоб замести следы. Ненужное вырезано тут. Проблема заключаентся в том что если отсутсвует соединение с интрнетом, то функция остается висеть в потоке и якобы чего-то скачивается в текстовый файл и размер растет в арифметической прогрессии. Если без потока - все нормально. Как корректно запускать функцию в отдельном потоке единоразаово с дальнейшим завершением потока после завершения функции?


Код:
///// Функция для выполнения в потоке

function DownloadThread : Integer;
begin
Result := 0;
// Начинаем загрузку файла с маршрутами
if GetInetFile('http://ссылка', ExtractFilePath(ParamStr(0)) + DOWNLOADFILENAME) = FALSE then
begin
SendMessage(hDwn, WM_CLOSE, 0, 0);
MessageBox(hApp, PChar('Не удалось загрузить файл'), PChar('Ошибка'), MB_ICONSTOP);
end
else
begin
Sleep(150);
// Считываем значения маршрутов из файла
LoadRoutesServer(GetDlgItem(hDwn, IDC_PBR_INFO), GetDlgItem(hApp, IDC_LVIEW_IP));
// Усыпляем программу чтобы е было так быстро все
Sleep(150);
// Закрываем наш диалог под конец
SendMessage(hDwn, WM_CLOSE, 0, 0);
end;
end;

///// Кусок кода из функции диалога WM_INITDIALOG

hThread := BeginThread(nil, 0, @DownloadThread, 0, 0, ThreadID);
if hThread <> 0 then
CloseHandle(hThread);
Автор: ShIvADeSt
Дата сообщения: 29.07.2008 01:19
Maks150988
А если вначале попробовать проверить, есть ли соединение с инетом перед стартом потока?
Автор: Jokerjar79
Дата сообщения: 29.07.2008 04:23
Maks150988, сделай брэйкпоинт на строку Result := 0; и пройди по шагам в отсутствии интернета. Возможно, из функции не выходит и поток тут вообще не при чем (на GetInetFile, например, зацикливается).

З.Ы. Есть также функция ExitThread
Автор: Ramazan
Дата сообщения: 29.07.2008 07:03

Цитата:
А вот передавать ссылку на компонент через границу приложение-длл не стоит - проблемы будут.

Вовсе не обязательно. Основные требования - включить компиляцию с runtime-пакетами (во избежание ошибок типа "Cannot assign TFont to TFont", "Class XXX already exists" и т.п.) и не пытаться выгрузить DLL до того, как будут освобождены созданные в библиотеке ресурсы (AV при выгрузке).

Вопрос немного не в тему: никому не встречалась утилита/эксперт для централизованного задания настроек группы проектов (параметры компиляции, линкера и т.д.)?
Автор: Mandor Sawall
Дата сообщения: 29.07.2008 08:37
Ramazan

Цитата:
Вопрос немного не в тему: никому не встречалась утилита/эксперт для централизованного задания настроек группы проектов (параметры компиляции, линкера и т.д.)?

Для проектов - видел только експерт "Project Option Sets", входящий в GExperts.
Для группы проектов, по моему, нет, посколько у каждый проект в группе есть собственные настройки.
Когда мне нужны разные настройки для debug и release, делаю так: проект настроен для debug, а release делаю через внешный "сборщик" - want.
Автор: Maks150988
Дата сообщения: 29.07.2008 09:10
ShIvADeSt
Проблема в том что допустим есть какой-нибудь сетевой экран и если правил для программы нет, то пока он их создает или же не принято решение пускать программу в сеть, то в файл подолжает записываться какая-то информация на сотню мегабайт.
Jokerjar79
Поставил ExitThread и заменил функцию на процедуру ради интереса. Вот если с процедурой - все нормально проходит и проблема отпадает. =)
Автор: Jokerjar79
Дата сообщения: 29.07.2008 09:28
Ах да, для CreateThread нужно скармливать процедуру типа

procedure (P: Pointer);
Автор: Ramazan
Дата сообщения: 29.07.2008 11:06
Mandor Sawall
GExperts знаю. У меня 37(!) проектов в группе, а для разных режимов отладки актуальны разные настройки. Держаться нету больше сил!

Так что вопрос сверхактуален.
Автор: OdesitVadim
Дата сообщения: 29.07.2008 14:03
в принципе есть три варианта.
первый - сделать inc файл и подключить его во все файлы. долго, муторно, но потом достаточно будет поправить один файл и пересобрать весь проект.

Способ два.
компилятору можно передавать дефайны. А в самом коде уже применять нужные настройки

Ну и третий - если используем делфи 2007, то можно использовать msbuild. Это приблизительно тоже, что и make.
Автор: Mandor Sawall
Дата сообщения: 29.07.2008 14:04
Ramazan
Отладки автоматизированные (напр. через DUnit) или просто запуск в IDE?


Добавлено:

Продолжу список:
4: Използувать внешное средство сборки, напр. want.
5: Сделать разные .cfg для всех режимов и копировать их в папку проекта когда нужно. Можно сделать bat для етого, которого можно даже подключить к группе (bpg).
Автор: Ramazan
Дата сообщения: 29.07.2008 14:41
Mandor Sawall
Запуск в IDE BDS2006. TDD не используем.

OdesitVadim
Данные варианты рассматривались, но хотелось бы минимизировать прилагаемые усилия - поставил и запустил (ну да, ленивый я ). С учетом того, что два дня поиска в сети ничего путного не дали, похоже это единственный вариант (если не браться за написание эксперта).

Может я чего пропустил?

Добавлено:

Цитата:
внешное средство сборки, напр. want.

Честное слово, первый раз слышу. Можно ссылку, лучше в ПМ.

Цитата:
разные .cfg

Может помочь при обработке dcc32, для интегрированной отладки - вряд ли. Кроме того, BDS2006 берет настройки из .bdsproj, а создавать и копировать их и вовсе проблемно. А еще есть Starteam, соответственно неизвестно, у какого проекта какие настройки в настоящий момент.
Автор: OdesitVadim
Дата сообщения: 29.07.2008 14:53
Для того, что бы позволить себе быть ленивым, надо вначале напрячся или напрячь кого то другого.

Цитата:
С учетом того, что два дня поиска в сети ничего путного не дали

А может просто не знаем,что искать?
Автор: Ramazan
Дата сообщения: 29.07.2008 15:09
OdesitVadim

Цитата:
А может просто не знаем,что искать?

Ну так ткните носом, что вам, трудно?
Автор: OdesitVadim
Дата сообщения: 29.07.2008 15:27
Мы у вас не работаем, не знаем, что вам надо.
Автор: Ramazan
Дата сообщения: 29.07.2008 16:00
Хм, переформулирую. Мне необходимо отключить, скажем, оптимизацию для всех (или некоторых) проектов в группе с наименьшими затратами. Буду благодарен за любой совет.
Автор: OdesitVadim
Дата сообщения: 29.07.2008 16:35
Ок. В свое время я использовал связку msbuild+bat файл+самописная утилита.
батник запускал утилиту, с помощью которой я устанавливал необходимые параметры (она ещё читала код с hasp ключа, записывала данные о нем в базу). потом генерировала/правила конфиги для проектов. Дальше запускала msbuild, потом утилиту для накладывание пакета hasp, потом этов инсталлятор заворачивалось, дальше iso и в конце концов писалось на диск.
То есть, мне надо было лишь вставить хасп ключ и поставить болванку в привод. всё остальное будет сделано автоматом. Делало за минут 5.
Я там не работаю, а люди до сих пор пользуются

А проект в делфи всегда запускался в отладочном режиме, так что я там ничего не трогал.

P.S. для тех, кто прочитает и начнёт критиковать вышенаписанное. Моя программа использовалась в специфических условиях, для каждого заказчика могла быть собрана своя версия. Если надо было обновить программу, то либо приходили ко мне с своим хасп ключём, либо сообщали специальный код, и в ответ получали готовый диск, который был заточен под них. Вставил, он сам всё обновил. Людям доверять нельзя было.
Автор: Ramazan
Дата сообщения: 29.07.2008 21:30
OdesitVadim
Спасибо, но механизм генерации релизов у нас тоже отработан, хотелось бы упростить процесс именно отладки.
Автор: SZap
Дата сообщения: 29.07.2008 22:27
Уважаемые, две страницы назад задавал вопрос касательно изменения свойств компонентов чужой программы...
Мне дали ссылки на инфо по данному вопросу. Почитал. Кое что понял и реализовал. Но остались некоторые вопросы...

В чужой программе есть компонент TPageControl с одной видимой закладкой (я знаю, что фактически их должно быть 5, разработчик просто их скрыл), необходимо их сделать доступными.
Что делаю:
Получаю хендл компонента (дочернего окна нужного приложения), определяю, что его тип TPageControl читаю его TTabSheet (дочерние окна), в результате получаю 5 хендлов с типом TPageControl. С помощью SendMessage могу менять свойство Visible у TPageControl-ов. В принципе все, что хотел сделал, но переключение между закладками могу производить только программно из своей программы, что не очень удобно.

Я ни как не могу сделать видимыми TabVisible этих закладок, чтобы они появились в чужой программе для более удобного использования .
Подскажите пожалуйста как это можно реализовать???
Автор: Frodo_Torbins
Дата сообщения: 30.07.2008 11:37
SZap
Боюсь, что никак нормально этого не сделать.
Автор: SZap
Дата сообщения: 30.07.2008 11:46
Frodo_Torbins
Я предполагаю, что это можно сделать при помощи сообщения TCM_SETITEM окну TTabSheet, но как именно не понимаю...(
Синтаксис согласно MSDN следующий:
Цитата:

lResult = SendMessage(      // returns LRESULT in lResult
(HWND) hWndControl,      // handle to destination control
(UINT) TCM_SETITEM,      // message ID
(WPARAM) wParam,      // = (WPARAM) (int) iItem;
(LPARAM) lParam      // = (LPARAM) (LPTCITEM) pitem;
);     
Parameters
iItem - Index of the item.
pitem - Pointer to a TCITEM structure that contains the new item attributes. The mask member specifies which attributes to set. If the mask member specifies the TCIF_TEXT value, the pszText member is the address of a null-terminated string and the cchTextMax member is ignored.

Не понимаю, что указывать в качестве WPARAM и LPARAM параметров...
Автор: Frodo_Torbins
Дата сообщения: 30.07.2008 12:29
SZap
Вряд ли.
С помощью TCM_SETCURSEL можно активировать нужный таб, но PageControl проверит, является ли соответствующий TabSheet видимым. С помощью TCM_INSERTITEM можно создать новый таб, но он никак не будет связан с невидимым TabSheet, даже если индекс будет совпадать.
Единственный выход - поставить хук (Hooks - аспекты реализации). Ждем пока родителю пейджконтрола прийдет сообщение WM_NOTIFY с параметром TCN_SELCHANGE. Проверяем индекс таба с помощью TCM_GETCURSEL. Если это созданный нами с помощью TCM_INSERTITEM таб, то в обход механизмов VCL сами показываем нужный TabSheet.
Автор: SZap
Дата сообщения: 30.07.2008 13:22
Frodo_Torbins
Я чегото не понял??? Мне все таки кажеться, что закладки существуют, просто они скрыты, как и сами TabSheet. И если я могу делать видимыми сами TabSheet, то почему не могу делать видимыми их закладки??? Я в корне не понимаю одного, чем являются закладки по отношению к TabSheet? Или они всетаки относятся к TPageControl? Тогда чем они являються для него?
Извините за назойливость, просто очень хочеться все понять правильно....

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


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