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

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

Автор: art0123
Дата сообщения: 22.10.2008 18:33
Pasha_new Последняя Embarcadero (CodeGear) RAD Studio 2009
Тебе сюда... http://forum.ru-board.com/topic.cgi?forum=35&bm=1&topic=41251#1
Автор: fcdobpiy
Дата сообщения: 22.10.2008 18:43
вопрос запостил еще на вингарде, но вдруг кто атм не бывает и знает ответ

вопрос этот практически нигде не освещен , ну я не смог найти в общем.

использую delphi 2007 . в ней есть настройки параметров сборки Release и Debug . одна из разниц между ними - не включается отладочная информация.
возникло 2 вопроса
1. если я использую делфи без всяких сторонних компонентов, то в debug сборке берутся dcu файлы из папок, указанных в debug dcu files (настройки среды), а в релизе из library paths ?
2. когда устанавливаешь сторонние компоненты , напрмиер тот же fibplus, они компилируются в обе версии , или только в релиз, или только в дебаг?
т.е. интересует процесс разработки
ставится делфи, ставятся все нужные компоненты но компилируются они все в дебаг сборку. получив приемлимый результат работы мы (с помощью скривтов автосборщика, ну или машины где все версии компонент собраны в релиз) мы собираем релиз версию?

лет 5 уже программирую на делфи , но как то этому не придавал значения, да и не знал. надо рости. поделитесь опытом .
Автор: delover
Дата сообщения: 23.10.2008 07:56
fcdobpiy
Интересный вопрос, действительно, так как дело может быть не только в dcu. Если ide имеет пакеты с собранными одноимёнными модулями, то она может подумать, что от туда взять быстрее, чем с диска.
Автор: delover
Дата сообщения: 23.10.2008 13:48

Цитата:
if Assigned(AValue) and Assigned(AValue.Intercept) and Assigned(FIntercept) then begin
-----------------------------------------------------^ а вот сдесь наступает крах

2да, такое тоже бывает, есть такая опция Complete boolean eval в настройках проекта.
Автор: DmitryKz
Дата сообщения: 23.10.2008 16:39
Ребята, помогите, а то я запутался: нигде у себя и в инете не нашел рабочего примера приложения работы с базой данных, где используется отношение "многие-ко-многим". Таблицы с такими отношениями у меня уже есть, но как в Дельфи сделать, чтобы при выборе данных из одной таблицы отображались данные из 3-й (если вторая используется для связи между остальными).
Автор: Frodo_Torbins
Дата сообщения: 23.10.2008 19:19
fcdobpiy

Цитата:
1. если я использую делфи без всяких сторонних компонентов, то в debug сборке берутся dcu файлы из папок, указанных в debug dcu files (настройки среды), а в релизе из library paths ?

Да.

Цитата:
2. когда устанавливаешь сторонние компоненты , напрмиер тот же fibplus, они компилируются в обе версии , или только в релиз, или только в дебаг?

Все зависит от самих компонентов. Обычно только релиз. Подробнее можно узнать посмотрев какие пути прописаны в "Debug DCU path". Например джедайские компоненты прописываются там и компилируются в две версии, если поставить галочку в инсталлере.
Автор: ShIvADeSt
Дата сообщения: 24.10.2008 02:10
DmitryKz

Цитата:
Таблицы с такими отношениями у меня уже есть, но как в Дельфи сделать, чтобы при выборе данных из одной таблицы отображались данные из 3-й (если вторая используется для связи между остальными).

Делай 2 отдельных запроса, в одном одна таблица, во втором вторая. При смене записи в первой фильтруй записи во второй по айдишнику.
Автор: AlekXL
Дата сообщения: 24.10.2008 04:15
fcdobpiy
На второй вопрос. Если ты просто компилируешь пакет в среде, компоненты компилируются только в одну из версий - в соответсвии с настойками самого пакета, обычно без отладочной информации. Обрати внимание, что в случае с JVCL о котором пишет Frodo_Torbins, истользуется сторонний установщик.
Кроме того, есть, кажется, один ньюанс. Если в Lib path компилятор находит исходники модулей, то при перестройке он будет компилить их с параметрами компиляции проекта, т.е. будут учитываться опции создания отладочной информации, да и другие тоже.
Автор: fcdobpiy
Дата сообщения: 24.10.2008 06:11
AlekXL

Цитата:
Кроме того, есть, кажется, один ньюанс. Если в Lib path компилятор находит исходники модулей, то при перестройке он будет компилить их с параметрами компиляции проекта, т.е. будут учитываться опции создания отладочной информации, да и другие тоже.

это вот как раз заметил. сделал чтобы все dcu складывались в отдельную папку. после компиляции там как раз лежали все нужные dcu и от JVCL и от моих библитек. а пути до них были в Lib path.

ну и на форуме буржуйском http://objectmix.com/delphi/402712-debug-vs-release-build.html прозвучала такая фраза
[more]
The IDE debugger uses debug information that is compiled into the DCUs
and does not get linked into the executable. This type of
debug information can only be used by the IDE. There are two other
types of debug information available, though. For them you can find two
checkboxes on the Project Options linker page.

TD32 debug information (in the old Turbo Debugger format) is compiled
into the executable if you check that box and it
seriously increases the executable size. No Delphi tool uses this
information but some 3rd-party tools (like profilers and error
reporting tools) can use it to turn code addresses to sensible names.

Remote debug information is intended to be used with the Delphi remote
debugger to debug an application that is running on another machine
with the IDE. This debug information is placed into a separate file
(extension rds if memory serves) that has to be put into the same
folder the executable to debug resides in. This type of debug info can
also be useful if you try to debug a system of several executables in
the IDE, since you can load it for a given module to enable the
debugger to show more than opaque assembly code for the module.[/more]

ну а из личного опыта - как вы собираете релизы ?
Автор: delover
Дата сообщения: 24.10.2008 15:28
fcdobpiy
Я делаю тупо. Чудес не бывает (касательно кремния), файл - это файл и всё. Если берёт не то, значит всё равно берёт с диска...
Автор: Frodo_Torbins
Дата сообщения: 24.10.2008 16:50

Цитата:
ну а из личного опыта - как вы собираете релизы ?

Обязательно включаю EurekaLog, или какой нибудь другой логер. Ну а все остальные настройки - чтобы екзешник минимум места занимал.
Автор: YuriyRR
Дата сообщения: 24.10.2008 16:56
Через OLE Drag & Drop перетаскивается текст в ячейку Exel из другой прилады, но в обьединенную ячейку не падает, а выдается ошибка 'не могу изменить часть обьединенной ячейки'.
кто может подсказать как такое реализовать, в принципе не обязательно через OLE
Автор: ShIvADeSt
Дата сообщения: 25.10.2008 05:53
YuriyRR
Это проблема Екселя, а никак не Дельфи. Спрашивай в топике по Ексель ВБА
Автор: LadyOfWood
Дата сообщения: 25.10.2008 12:35

Цитата:
ну а из личного опыта - как вы собираете релизы ?

{$J-}
{$H+}
{$P+}
{$T-}
{$X+}
{$B-}
{$O+}
{$A8}
{$Z1}
{$R-}

{$IFDEF DEBUG}

{$W+}
{$D+}
{$L+}
{$Y+}
{$C+}
{$I+}
{$Q+}

{$ELSE}

{$W-}
{$D-}
{$L-}
{$Y-}
{$C-}
{$I-}
{$Q-}

{$ENDIF}
Автор: Maks150988
Дата сообщения: 25.10.2008 18:33
Здраствуйте. Нужно средствами Апи выполнить ownerdraw трекбара. Итак, долго искал я примеры реализации на просторах интернета, но самый нормальный видеть пример находится здесь, однако это на Си, поэтому некоторые тружности у меня возникли с переносом кода. По смыслу и догадкам наляпал "набросок" так сказать. Получилось [more=вот]program sample;

uses
Windows, Messages, CommCtrl;

{$R dialog.res}

const
RC_DIALOG = 101;
ID_TRACKBAR = 101;

var
hApp : THandle;

function AppFuncProc(hWnd : HWND; uMsg : UINT; wParam : WPARAM; lParam : LPARAM) : BOOL; stdcall;
var
BrushNew : hBrush;
BrushOld : hBrush;
PenBrush : hPen;
begin
Result := TRUE;

case uMsg of

WM_INITDIALOG :
begin
hApp := hWnd;
end;

WM_DESTROY, WM_CLOSE :
begin
PostQuitMessage(0);
end;

WM_NOTIFY :
begin
with PNMHdr(lParam)^ do

if PNMHdr(lParam).idFrom = ID_TRACKBAR then
begin
case PNMHdr(lParam)^.code of

NM_CUSTOMDRAW :
begin
with PNMLVCUSTOMDRAW(lParam)^ do
begin
case nmcd.dwDrawStage of

CDDS_PREPAINT :
begin
Result := BOOL(CDRF_NOTIFYITEMDRAW);
SetWindowLong(hApp, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW or CDRF_NOTIFYPOSTPAINT);
end;

CDDS_ITEMPREPAINT :
begin
case nmcd.dwItemSpec of
TBCD_THUMB :
begin
BrushNew := CreateSolidBrush(RGB(200, 215, 240));
BrushOld := SelectObject(nmcd.hDC, BrushNew);
FillRect(nmcd.hDC, nmcd.rc, BrushNew);
PenBrush := CreatePen(PS_SOLID, 1, RGB(50, 105, 200));
SelectObject(nmcd.hDC, PenBrush);
Rectangle(nmcd.hDC, nmcd.rc.Left, nmcd.rc.Top, nmcd.rc.Right, nmcd.rc.Bottom);
DeleteObject(PenBrush);
SetBkColor(nmcd.hDC, RGB(200, 215, 240));
SelectObject(nmcd.hDC, BrushOld);
DeleteObject(BrushNew);
SetBkMode(nmcd.hDC, TRANSPARENT);
end;
end;
Result := BOOL(CDRF_SKIPDEFAULT);
end;

CDDS_ITEMPOSTPAINT :
begin
Result := BOOL(CDRF_SKIPDEFAULT);
end;


else
Result := BOOL(CDRF_DODEFAULT);
SetWindowLong(hApp, DWL_MSGRESULT, CDRF_DODEFAULT);
end; // case nmcd.dwDrawStage of
end; // with PNMLVCUSTOMDRAW(pnmh)^ do
end; // NM_CUSTOMDRAW:

end;
end;
end;


else
Result := FALSE;

end;
end;

begin
InitCommonControls;
DialogBox(hInstance, MAKEINTRESOURCE(RC_DIALOG), 0, @AppFuncProc);
end.[/more] что... Сразу вопрос, почему ползунок тоже перерисовывается? Вроде смотрел тот код и там ничего необычного такого нет... Может надо CDRF флаги как-то скомбинировать? Там вроде такие же аналогичные использованы... Потом, захотелось мне менять раскраску ползунка пр наведении/отведении указателя. Не получилось обработать nmcd.uItemState для этого, вернее я код поместил в CDDS_ITEMPREPAINT и все равно цвет то менялся, то не менялся. Поэтому пришлось убрать этот код... Потом хотелось бы прорисовать риски на шкале и саму линию, по которой полунок перемещается. Смотрел как в том примере сделано, чего-то не получлось прорисовать.наверное может быть оно то и прорисовывалось, но раз сама стандартная прорисовка ползунка видна, значит наверное и по умолчанию цвет на мой прорисовываемый накладывался на риски и линию и из-за этого такая фигня. Тоже пришлось убрать код...

Код из ресурсного файла

Код: 101 DIALOGEX 0, 0, 200, 170
STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION ""
LANGUAGE LANG_RUSSIAN, 0x1
FONT 8, "Tahoma"
{
CONTROL "", 101, "msctls_trackbar32", TBS_HORZ | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 25, 127, 18
}
Автор: DmitryKz
Дата сообщения: 26.10.2008 00:10
Скажите, должны ли работать Экшены в Датамодуль? В Датамодуле у меня компоненты Датасет и связанный с ним Датасорс. Я хочу повесить на событие OnDataChange Датасорса Экшен, но в выпадающем списке его нет. Вручную прописать, понятно, тоже не получается. Мне нужно в трех ситуациях обработать событие, когда меняется текущая запись в ДБГриде, в остальное время эту обработку исключить. Если яснее, то так: в Эдите (не ДБЭдите) пользователь вводит инфу, одновременно фильтруются записи в ДБГриде, верхняя всегда выделена; также пользователь может клавишами и мышкой выделять записи в ДБГриде. В-общем, на эти три действия (фактически это одно событие OnDataChange) надо повесить один Экшен. Все это надо, чтобы избежать лишних кнопок на форме и лишних телодвижений для пользователя. Кто-нибудь сталкивался с этим???
Автор: Maks150988
Дата сообщения: 26.10.2008 21:13
И еще, ребята, хотелось бы помощи в оптимизации части кода для программы. Вкратце: имеем строку с данными о маршруте вида 10.10.10.10 mask 255.255.255.255 (name) или вида 10.10.10.10 (name). Необходимо из такой строки выцепить адрес маршрута, его маску и название. Для тех кто не понял что имелось ввиду, поясню, Адрес - 10.10.10.10, маска - 255.255.255.255, название name.

Раньше делал функцию для вытаскивания названия маршрута из такой строки. Первый неоптимизированный вариант скажем был таким:

Код: function GetRouteNameFromString(StrPrs : String) : String;
var
Domen : String;
I : Integer;
P : Integer;
begin
Result := '';
// Удаляем из начальной строки последний символ (скобка после названия)
Delete(StrPrs, Length(StrPrs), 1);
// Проходимся по все строке и ищем начальную скобку перед названием
P := -1;
for I := Length(StrPrs) downto 1 do
begin
if StrPrs[I] = '(' then
begin
P := I;
Break;
end;
end;
// Если скобку нашли - получаем название из начальной строки
if P <> -1 then
Domen := Copy(StrPrs, P + 1, Length(StrPrs));
Result := Domen;
end;
Автор: Frodo_Torbins
Дата сообщения: 26.10.2008 22:22
Maks150988
Такие вещи принято делать через TRegExpr. Весь ваш код превратится в две строки-маски
Автор: Maks150988
Дата сообщения: 26.10.2008 23:43
Frodo_Torbins
Да мне собственно надо на одном паскале + апи если возможно. Я так понимаю TRegExpr на VCL завязан.
Покумекал я немного и переделал функциии:


Код: function IsMaskRouteReadString(S : String) : Boolean;
begin
if Pos('mask', S) > 0 then
Result := TRUE
else
Result := FALSE;
end;

function GetRouteNameFromString(S : String) : String;
var
I : Integer;
begin
Result := S;
Delete(S, Length(S), 1);
I := Pos('(', S);
Result := Copy(S, I + 1, Length(S));
end;

function GetRouteAddressFromString(S : String) : String;
var
I : Integer;
begin
Delete(S, Length(S), 1);
if IsMaskRouteReadString(S) then
I := Pos('mask', S)
else
I := Pos('(', S);
Result := Copy(S, 1, I - 2);
end;

function GetRouteMaskFromString(S : String) : String;
var
I : Integer;
L : Integer;
begin
L := Length(GetRouteNameFromString(S));
Delete(S, Length(S), 1);
I := Pos('mask', S);
Result := Copy(S, I + 5, Length(S));
Delete(Result, Length(Result) - L - 1, L + 2);
end;
Автор: fcdobpiy
Дата сообщения: 27.10.2008 07:18
Maks150988
RegExpr отличная вещь. использует следующие модули
Classes, // TStrings in Split method
SysUtils; // Exception
Windows; // CharUpper/Lower

несомненный плюс - проще модифицировать, при малейшем изменении формата входной строки. ну и защита от лишних пробелов и т.п.

delover
LadyOfWood
Frodo_Torbins
спасибо, счас буду обрабатывать полученые знания )
Автор: delover
Дата сообщения: 27.10.2008 08:36
all
Глупый вопрос, может быть, конвертировать время будильника, после того как часы были переведены на час, - это дополнительный сервис? (удалено)

зы
теперь без зы
Автор: Frodo_Torbins
Дата сообщения: 27.10.2008 09:48
Maks150988

Цитата:
Да мне собственно надо на одном паскале + апи если возможно. Я так понимаю TRegExpr на VCL завязан.

Вы бы для начала хоть заглянули туда, чтоли. Там архив всего 80Кб.
Автор: Mandor Sawall
Дата сообщения: 27.10.2008 10:37
Maks150988
Вот вариант оптимизации.


Код:
function GetRouteNameFromString(S : String) : String;
var
I : Integer;
begin
I := Pos('(', S);
if (I > 0) then
Result := Copy(S, I + 1, Length(S)-1)
else
Result := '';
end;

function GetRouteAddressFromString(S : String) : String;
var
I : Integer;
begin
I := Pos('mask', S);
if (I = 0) then
I := Pos('(', S);
Result := Copy(S, 1, I - 2);
end;

function GetRouteMaskFromString(S : String) : String;
var
I : Integer;
J : Integer;
begin
I := Pos('mask', S);
if (I > 0) then
I := I + 4;
J := Pos('(', S);
Result := Copy(S, I+1, J-I-2);
end;
Автор: delover
Дата сообщения: 27.10.2008 12:03
Добавил зы
http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D1%84%D0%B0%D0%B3%D0%BE%D1%80
Автор: Maks150988
Дата сообщения: 27.10.2008 14:06
Mandor Sawall
В результате функции GetRouteNameFromString должно быть Copy(S, I + 1, Length(S)-I-1), иначе копируется последняя скобка в название маршрута.
Frodo_Torbins
Да у меня чего-то инетрнет тормозил, поэтому я мало по сайту полазил. А так посмотрю что модули там раз такое дело.
fcdobpiy
Да может оно конечно и проще модифицировать, но там SysUtils полновесный, а тут без этой ерунды.
Автор: Maks150988
Дата сообщения: 28.10.2008 07:13
А, да, еще вот хотелось бы чтобы кто-нибудь из вас, программистов, помог с кодом. Имеем например строку, которую скачали с сайта - это например полноценный текстовый файл. Так вот необходимо его распарсить и позагонять строчки в массив. Я делал такую фичу через чтение текстового файла, но бывает что диск нагружен всякими торрентами/ослами/качалками и программа иногда подвисает при записи скачанных данных на диск, да еще и всякие заморочки чтобы файл удалять каждый раз чтоб юзер не замечал следов действий. Вобщем сейчас пока так:

Код: while not EOF(TextF) do
begin
ReadLn(TextF, StrFl);
ResSt := PChar(@StrFl[1]);
if not((ResSt = '')) then
begin
// Увеличиваем на одно значение параметр числа строк
Inc(Index);
// Одновременно заполняем массив с маршрутами из файла
RouteList[Index] := PChar(ResSt);
end;
end;
Автор: Jokerjar79
Дата сообщения: 28.10.2008 08:10
Maks150988, можно попробовать через StringList

Код: var
List: TStringList;

begin
List := TStringList.Create;
List.LoadFromFile(FileName);
// Доступ к строкам List.Strings[i]
List.Free;
end.
Автор: Maks150988
Дата сообщения: 28.10.2008 09:07
Jokerjar79
Да не, тут надо без сохранеия на диск. Сразу в памяти распарсить на строки, позагоняв их в массив.
Автор: Czechoslovak
Дата сообщения: 28.10.2008 09:27
Может кто подскажет компонент счетчика в виде "нормального физического счетчика" ну типа как счетчик воды или газа,о есть с циферблатом стрелочным и цифровым?
Автор: ShIvADeSt
Дата сообщения: 28.10.2008 10:34
Maks150988

Цитата:
for i := 1 to Length(RouteList) - 1 do
begin
Вот тут как-то надо обрабатывать наверное через Pos
Ну или искать символ #13#10, прерываться и добавлять строку в массив
end;

вместо for лучше while примерно так

Код:
i:=0;
RouteList:=RouteList+#10#13;//чтобы точно оканчивалось на перевод строки
while Length(RouteList)>0 do begin
if Pos(#10#13,RouteList)>1 then begin //убеждаемся что не пустая строка
tSt:=Copy(RouteList,1,Pos(#10#13,RouteList)-1);// -1 так как перенос строки нам не нужен
Inc(i);
MyArray[i]:=tSt;
end;
Delete(RouteList,1,Pos(#10#13,RouteList)+1);
end;

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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