![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли получить информацию о conditional defines в рантайме? [D2005, XP]
Abcdef123 © (2011-06-01 09:04:00)Здравствуйте, Мастера.
Можно ли информацию (всю строку), которая использовалась при компиляции проекта увидеть в рантайме, у примеру на форме назначить как Label.caption...? Если возможно, то как?
Заранее спасибо!
Abcdef123 (2011-06-03 10:44:00) [1]To [11] я попробовала сейчас изобразить ваш пример как проект dopt, да сообщение показывает, но я никак не пойму, как это можно использовать для решения моего вопроса? Могли бы вы пояснить, плз?
А по поводу [12] совсем не поняла, это по той же теме, в дополнение к вашему [11] примеру? Если да, то как "привязать" dopt к package come_pack?
han_malign (2011-06-03 09:24:00) [2]кстати о птичках - Мастер проекта обычно перелопачивает секцию
usesв .dpk/.dpr и удаляет все лишние(по его мнению) строки и комментарии.
помогает вот такой финт:
unit _IfdefMagicDumb;
interface
implementation
end.
-------------------------
package come_pack;
uses
...
Form1 in 'Form1.pas' {TFom1},
_IfdefMagicDumb in '_IfdefMagicDumb.pas' {$IFOPT D+},
Form2 in 'debug\Form2.pas' {TFom2},
some_spec_ not_formin 'debug\some_spec_ not_form.pas' {$ELSE},
Form2 in 'release\Form2.pas' {TFom2},
some_spec_ not_formin 'release\some_spec_ not_form.pas' {$ENDIF},
...........
han_malign (2011-06-03 08:58:00) [3]
unit common_opt;
interface
const
sOpt = 'sample';
iOpt1= 1;
iOpt2= 2;
function print: string;
implementation
uses SysUtils;
function print: string;
begin
Result:= 'sOpt: "'+ sOpt+'"; iOpt(' + IntToStr( iOpt1 )+',' + IntToStr( iOpt2 )+')';
end;
end.
program dopt;
{$APPTYPE CONSOLE}
uses
Windows,
common_opt in " some_specialization_path\common_opt.pas";
{$IF sOpt='sample'}
{$MESSAGE 'Is a Conditional Compile Options sample'}
{$IFEND}
{$IF iOpt1<>1}
{$MESSAGE WARN 'Unexpected iOpt1'}
{$IFEND}
begin
{$IF iOpt1=1}
Writeln(common_opt.print);
{$ELSE}
Writeln('Invalid Compile Options '+common_opt.print);
{$IFEND}
end.
Германн (2011-06-03 02:57:00) [4]Удалено модератором
Лайма (2011-06-02 19:07:00) [5]
> Извините, но ничего не понятно, что вы написали.
Тут никто не понимает, что пишет Анатолий.
Это совершенно нормально.
Abcdef123 (2011-06-02 05:02:00) [6]Большое спасибо всем откликнувшимся, особенно [4] и [5].
To [4] Ваш ответ подтвердил мои сомнения. Если заметили, я поставила в заголовке "можно ли", и уж потом, если да, то как. Ваш ответ означает - нельзя.
To [5]. Ваша идея, это как говорится - хоть что то. Поскольку нет возможности реализовать как я предполагала, то хотя бы вашим примером можно хоть как то передать информацию в рантайм. Хотя, конечно, не очень удобно, так как надо будет не забывать всегда добавлять все возможные кондиции в эту функцию, в случае, если новое условие будет введено в conditional defines.
To [6] [7] Извините, но ничего не понятно, что вы написали. К примеру "Это никакого отношения к компиляции не имеет" - что ЭТО? Если имеете в виду conditional defines, то как раз имеют. седьмой вообще не знаю как прокомментировать. Могли бы вы объяснить по русски, плз?
Anatoly Podgoretsky (2011-06-01 14:02:00) [7]> Abcdef123 (01.06.2011 10:06:02) [2]
А ответ "для чего". Для возможности запуска с разными условиями, чтобы их не
задавать каждый раз.
Они даже не являются частью проекта. Частью проекта являются только те,
которые указаны в самом проекте.
Anatoly Podgoretsky (2011-06-01 13:59:00) [8]> Abcdef123 (01.06.2011 10:06:02) [2]
Это никакого отношения к компиляции не имеет.
DiamondShark (2011-06-01 11:16:00) [9]
> Caption := <КАК вызвать дельфийское значение conditional
> defines???>;
function MyDefines : string;
begin
result := '';
{$IFDEF RND}
result := result + 'RND ';
{$ENDIF}
{$IFDEF KUKU}
result := result + 'KUKU ';
{$ENDIF}
end;
~AQUARIUS~ (2011-06-01 11:03:00) [10]В рантайме их определить нельзя - это управляющие конструкции для компилятора, после компиляции их попросту нет, примерно как имен переменных
OW (2011-06-01 10:50:00) [11]не знаю, но
не лучше будет писать не в в меню Project->Options->Directory/Conditionals комбобокс conditional defines
vs
а в отдельном модуле, руками, списком
{$DEFINE name1}
{$DEFINE name2}
И включить его в ресурсы, как строки, при компиляции?
(тут же всякие константы могут быть,
удобно, имхо)
Abcdef123 (2011-06-01 10:06:00) [12]To [1]
В Дельфи зайдите в меню Project->Options->Directory/Conditionals там увидите комбобокс conditional defines. Мы пишем туда разные определения (к примеру "RND;Ver110;..."и используем эти установки по разным причинам (тут может быть и в зависимости от клиента, от версии проекта), так что разные установки и компиляции проекта - в результате название экзешника то одно, а программа будет работать по разному.
К примеру,
{$IFDEF RND}
Amt := 100;
{$ENDIF}
Amt := 100.34;
{$ENDIF}
И нам было бы удобно знать, с какими установками был скомпилирован тот и ли иной экзешник.
Это я написала - для чего мы используем установки conditional defines.
А теперь по поводу кода - если б знала как написать код, то и не было бы вопроса. Попробую объяснить на примере, как должно выглядеть:
Если, к примеру мы скомпилировали проект с такими установками conditional defines=RND;Ver110
А при запуске проекта мы хотим видеть к примеру в заголовке главной формы этот текст "RND;Ver110".
А вот теперь вопрос: Что я должна прописать в программе, чтобы заголовку формы присвоилась строка этих установок?
procedure TForm1.FormShow(Sender: TObject);
begin
Caption := <КАК вызвать дельфийское значение conditional defines???>;
end;
P.S. Примеры для простоты я утрировала, конечно, но суть вопроса надеюсь ясна.
Anatoly Podgoretsky (2011-06-01 09:20:00) [13]> Abcdef123 (01.06.2011 09:04:00) [0]
Теперь по русски и с кодом.