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

» Вопросы по Delphi 2

Автор: OrlangurStep
Дата сообщения: 16.05.2006 12:49
Как в Delphi7 получить из создаваемой программы ее версию?
Автор: FireZone
Дата сообщения: 16.05.2006 13:40
OrlangurStep

Код:
uses
.. windows, ..

function GetFileVersion(const fn: String): String;
var
tmp, InfoSize, FileInfoSize: DWord;
Info: Pointer;
FileInfo: PVSFixedFileInfo;
function IntToStr(i: Integer): String; begin Str(i, result) end;
begin
result:='';
FileInfo:=nil;
InfoSize:=GetFileVersionInfoSize(pChar(fn), tmp);
if InfoSize = 0 then Exit;
GetMem(Info, InfoSize);
GetFileVersionInfo(pChar(fn), 0, InfoSize, Info);
VerQueryValue(Info, '\', Pointer(FileInfo), FileInfoSize);
with FileInfo^ do
result:=inttostr(dwProductVersionMS shr 16) +'.'
+inttostr(dwProductVersionMS and $FFFF) +'.'
+inttostr(dwProductVersionLS shr 16) +'.'
+inttostr(dwProductVersionLS and $FFFF);
FreeMem(Info, InfoSize);
end;
Автор: OdesitVadim
Дата сообщения: 16.05.2006 13:40
OrlangurStep
http://www.delphiworld.narod.ru/base\get_app_version.html
http://www.delphiworld.narod.ru/base\file_version_info.html
http://www.delphiworld.narod.ru/base\get_file_version.html
Хватит?
Автор: Vetal303
Дата сообщения: 17.05.2006 00:23
OrlangurStep
А сделать About с версией программы можно так:

Цитата:
procedure TForm1.ShowAbout;
var
About:TForm;
S,TS:string;
h,sz,Len:DWORD;
Buf:PChar;
Value:Pointer;
LabelLeft,i:Integer;
begin
S:=Application.ExeName;
sz:=GetFileVersionInfoSize(PChar(S),h);
if sz>0 then
begin
Buf:=AllocMem(sz);
GetFileVersionInfo(PChar(S),h,sz,Buf);
VerQueryValue(Buf,'\VarFileInfo\Translation',Value,Len);
TS:=IntToHex(MakeLong(HiWord(Longint(Value^)),LoWord(Longint(Value^))),8);
About:=TForm.Create(Application);
with About do
try
Caption:='О программе: '+Application.Title;
Position:=poScreenCenter;
BorderStyle:=bsDialog;
with TImage.Create(Application) do
begin
Picture.Icon:=Application.Icon;
Left:=10;
Top:=10;
Parent:=About;
AutoSize:=True;
LabelLeft:=Left+Width+10;
end;
VerQueryValue(Buf,PChar('StringFileInfo\'+TS+'\ProductName'),
Pointer(Value),Len);
if Len>1 then
with TLabel.Create(Application) do
begin
Left:=LabelLeft;
Top:=About.Controls[About.ControlCount-1].Top;
Font.Size:=10;
Font.Style:= [fsBold];
Font.Color:=clNavy;
Parent:=About;
Caption:=StrPas(PChar(Value));
end;
VerQueryValue(Buf,PChar('StringFileInfo\'+TS+'\FileVersion'),
Pointer(Value),Len);
if Len>1 then
with TLabel.Create(Application) do
begin
Left:=LabelLeft;
Top:=About.Controls[About.ControlCount-1].Top+About.Controls[About.ControlCount-1].Height+5;
Caption:='Версия: '+StrPas(PChar(Value));
Parent:=About;
end;
VerQueryValue(Buf,PChar('StringFileInfo\'+TS+'\CompanyName'),
Pointer(Value),Len);
if Len>1 then
with TLabel.Create(Application) do
begin
Left:=LabelLeft;
Top:=About.Controls[About.ControlCount-1].Top+About.Controls[About.ControlCount-1].Height+5;
Caption:='Компания: '+StrPas(PChar(Value));
Parent:=About;
end;
VerQueryValue(Buf,PChar('StringFileInfo\'+TS+'\Author'),Pointer(Value),
Len);
if Len>1 then
with TLabel.Create(Application) do
begin
Left:=LabelLeft;
Top:=About.Controls[About.ControlCount-1].Top+About.Controls[About.ControlCount-1].Height+5;
Caption:='Автор: '+StrPas(PChar(Value));
Parent:=About;
end;
Height:=Controls[ControlCount-1].Top+Controls[ControlCount-1].Height+85;
Width:=10;
for i:=0 to ControlCount-1 do
if Controls[i]is TLabel then
if Controls[i].Left+Controls[i].Width+20>Width then
Width:=Controls[i].Left+Controls[i].Width+20;
with TButton.Create(Application) do
begin
Caption:='Ok';
Left:=Trunc((About.Width/2)-(Width/2));
Top:=Trunc(About.Height-60);
ModalResult:=mrOk;
// Cursor := crHandPoint;
Parent:=About;
end;
with TBevel.Create(Application) do
begin
Shape:=bsTopLine;
Style:=bsRaised;
Align:=alBottom;
Parent:=About;
Height:=About.Controls[About.ControlCount-1].Height+20;
end;
ShowModal;
finally
Free;
end;
end;
end;

только не забудьте подюзать "ExtCtrls"
Автор: FRALX
Дата сообщения: 17.05.2006 09:39
Подскажите пожалуста способ как сохранить в dfm вложенные компоненты.
Смысл в следующем - есть компонента DataProvider = class(TComponent), а внутри неё создается компонента Connection = class(Tcomponent), DataProvider соответственно является owner`ром Connection, как сделать так чтоб DataProvider сохранял внутри себя Connection ?
Автор: dyr farot
Дата сообщения: 17.05.2006 12:47
в смысле? все, что лежит на форме сохраняется в dfm. причем иерархия тоже сохраняется...
Автор: FRALX
Дата сообщения: 17.05.2006 14:26
dyr farot
Сохраняется в случае если проперть не типа TComponent (сохраняется иерархия Parent`ов а не Owner`ов), а в случае c TComponent возникают проблемы. Tакого рода ссылки хранятся как имена и владельцем всех этих компонент должна быть TForm. А мне нужно чтоб владельцем была не форма а мой компонент
Автор: OdesitVadim
Дата сообщения: 17.05.2006 15:11
FRALX
Компоненту ты создаёш ручками (ну тоесть в Create родителя), поэтому для анализа, что нужно сохранять, делфа должна "запустить" компонент и посмотреть.
Поэтому предлагаю более простой способ. В родительском компоненте делаем свойство ConnectionString и может ещё какие-то (по необхдимости). Тепперь при создании компонента-родителя мы на основании этих свойств создаём компонент. А сам дочерний компонент можно в private вообще занести
Автор: FRALX
Дата сообщения: 17.05.2006 15:24
OdesitVadim
Мне просто хочется, чтоб все настройки бд были доступны в том виде как их предоставляет компонент доступа к данным, чтоб не заморачиваться на переписывание провайдера, при изменении компонента доступа к данным.
На данный момент я нашел способ сохранять настройки компонента в бинарные проперти через DefinePropertyes. Немного не красиво в том смысле что дфм руками не поправить.
Автор: reenoip
Дата сообщения: 17.05.2006 19:13
Написал свой чудо-сервис. Здесь взял пример, как им можно управлять из другого приложения. Но в процессе компиляции возникает несколько предупреждений такого вида:

Код: [Warning] Unit1.pas(166): Symbol 'RaiseLastWin32Error' is deprecated
Автор: OrlangurStep
Дата сообщения: 17.05.2006 20:28
FireZone
Пасибы

Добавлено:
Посмотрите прогу- небольшая игра
Установщик и Исходники . Пароль для исходников "Orlangur". Скажите что можно улучшить и, мало-ли, баги.
Автор: RomanTim
Дата сообщения: 18.05.2006 07:07
reenoip

Цитата:
[Warning] Unit1.pas(166): Symbol 'RaiseLastWin32Error' is deprecated

Предупреждение о deprecated говорит о том, что процедура устарела. Ели заглянуть в SysUtils, где она описана, то там написано следующее:

Код: procedure RaiseLastWin32Error; deprecated; // use RaiseLastOSError
Автор: FireZone
Дата сообщения: 18.05.2006 08:43
OrlangurStep

Цитата:
Посмотрите прогу- небольшая игра
Установщик и Исходники . Пароль для исходников "Orlangur". Скажите что можно улучшить и, мало-ли, баги.

Установщик не качал. Билд из исходников сделать не удалось ввиду отсутствия у меня компонент, которые ты использовал. Есть небольшие замечания по исходнику. Все формы кроме главной лучше убрать из автосоздания и создавать их динамически когда нужно, иначе твоя программа нерационально расходует память. Все конструкции вида

Код: procedure TStartForm.ExitClick(Sender: TObject);
begin
StartForm.Close
end;
Автор: OdesitVadim
Дата сообщения: 18.05.2006 12:09
OrlangurStep
Посмотрел и я.
По воду динамического создания форм - полностю согласен с FireZone
Что за стремления к минимализму? У тебя что, разрешения экрана 100 на 75? Надо хоть чуточку больше.
У меня так и не получилось набрать не одного бала. Не знаю, вроде и рекция нормальная. Хотя вначале я пытался мышкой тыкать.

Когда появляется окошко ввода имени, я ничего не ввожу, но меня никак не ругают. Странно. А должны. А с другой стороны, зачем выводить окошко добавления результата, если у меня 0 очков?
Окошко "Остю время" у меня выглядит просто ужасно: на сером фоне (clBtnColor) цифры пишуться белым, а неподсвеченые сегменты - чёрным. Но при старте (в первую секунду)фон черный.
Символ диска на кнопке новой игры - сразу не догадался, благо подсказки есть. А вот иконка результатов - как раз подходит для новой игры.
Ещё писать или хватит?

Добавлено:

Код:
105:
begin
i1:= 0;
i2:= 2;
end;
33:
begin
i1:= 0;
i2:= 2;
end;
Автор: Sergey1970
Дата сообщения: 18.05.2006 14:18
Существует ли в Win переменная среды или что-то, по которой можно было бы определить уникальность загруженной сессии операционнки? Что-то типа идентификатора сессии. Если есть - куда копать что бы его достать?
Автор: dyr farot
Дата сообщения: 18.05.2006 16:02
что ты понимаеш под сессией?
Автор: Sergey1970
Дата сообщения: 18.05.2006 16:11
Время с начала работы операционной системы до ее останова. Мне необходимо идентифицировать была ли перезагрузка между двумя запусками моей программы. Или сколько раз была запущена моя программа в период без перезагрузки. Так же устроит идентификатор работы сеанса - без разницы.
Автор: OdesitVadim
Дата сообщения: 18.05.2006 16:28
Так сразу написал бы,что хочеш сделать прогу, которая запускается только один раз за время работы винды.

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
CRLF: string;
begin
if GlobalFindAtom('THIS_IS_SOME_OBSCUREE_TEXT') = 0 then
GlobalAddAtom('THIS_IS_SOME_OBSCUREE_TEXT')
else
begin
CRLF := #10 + #13;
ShowMessage('Это приложение может быть запущено только один раз за сессию Windows.' + CRLF +
'Если будет сделана ещё одна попытка запуска, нам придётся отформатировать вам винчестер...');
Halt;
end;
end;
Автор: Sergey1970
Дата сообщения: 18.05.2006 16:42
OdesitVadim
Я не писал что "хочу написать прогу, которая..." Чес слово, не писал! :о)))
Просто спросил существует ли какой-то идентифкатор "сесии" Win?

За подсказку спасибо, как вариант я это рассматривал :о)
Автор: MrZeRo
Дата сообщения: 18.05.2006 16:47

Цитата:
Время с начала работы операционной системы

Это определяется функцией GetTickCount.
Автор: MasMaX
Дата сообщения: 18.05.2006 17:03
Извините за тупой вопрос, но как вывести в TWebBrowser html файл находящийся в томже каталоге что и прога? Я делал WebBrowser1.Navigate('index.htm'). Но там идет запрос через HTTP, а мне надо файл!
Ещё раз сорри за тупизну, это моя первая и последняя прога на Дельфи...

Добавлено:
И как ещё можно отобразить HTML помимо данного компонента?
Автор: OdesitVadim
Дата сообщения: 18.05.2006 17:23
MasMaX

Цитата:
Но там идет запрос через HTTP, а мне надо файл!

Не надо так. Запрос там идёт так как надо.
попробуй так написать

Код:
WebBrowser1.Navigate(ExtractFilePath(Application.ExeName)+'index.htm')
Автор: Almaz
Дата сообщения: 18.05.2006 17:33
MasMaX

Цитата:
как ещё можно отобразить HTML помимо данного компонента?

запустить iexplorer.exe и передать ему имя файла как параметр
Автор: reenoip
Дата сообщения: 18.05.2006 17:35
RomanTim, спасибо, не знал.
Автор: MasMaX
Дата сообщения: 18.05.2006 19:10

Цитата:
Код:


Код: WebBrowser1.Navigate(ExtractFilePath(Application.ExeName)+'index.htm')

дело в том, что каталог мог смениться, и файл начал искаться в левом каталоге. Что бы убедиться, что каталог действительно не тот, щелкни правой кнопкой мыши в Webbrowser и выбери свойства. Там можно посмотреть полный путь.х
Автор: OrlangurStep
Дата сообщения: 18.05.2006 20:29
OdesitVadim

Цитата:
105,33:
begin
i1:= 0;
i2:= 2;
end;

Пасибо, что-то сразу не догадался.
Автор: OdesitVadim
Дата сообщения: 18.05.2006 20:35
OrlangurStep
А если заюзать массив констант, то можно вообще до 4-6 строк упростить
Автор: nekra
Дата сообщения: 19.05.2006 12:52
Добрый день. Интересует вопрос:
Как узнать на компьтере пользователя установлен классический стиль, либо он пользуется темами Windows XP?

Просто необходимо узнать установлен ли класический стиль или какой-то другой, какой без разницы.
Автор: dyr farot
Дата сообщения: 19.05.2006 13:12
IsThemeActive
Автор: OrlangurStep
Дата сообщения: 19.05.2006 16:28
OdesitVadim

Цитата:
А если заюзать массив констант, то можно вообще до 4-6 строк упростить


Код уже готовый и лень сильно перебатывать и так работает нормально.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


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