Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2

Модерирует : ShIvADeSt

ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы http://forum.ru-board.com/topic.cgi?forum=33&topic=3647&start=2020#lt
Внимание, все большие куски кода (более 5 строк) оформляем в тег [more] дабы уменьшить размер поста.

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:52 20-04-2006 | Исправлено: ShIvADeSt, 02:02 30-06-2006
OrlangurStep



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как в Delphi7 получить из создаваемой программы ее версию?

Всего записей: 1392 | Зарегистр. 08-04-2006 | Отправлено: 13:49 16-05-2006
FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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;

В качестве параметра функция берет имя файла программы. Можно передать напр. ParamStr(0)

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 14:40 16-05-2006
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
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
Хватит?

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 14:40 16-05-2006
Vetal303



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
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"

Всего записей: 498 | Зарегистр. 05-07-2004 | Отправлено: 01:23 17-05-2006
FRALX

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуста способ как сохранить в dfm вложенные компоненты.
Смысл в следующем - есть компонента DataProvider = class(TComponent), а внутри неё создается компонента Connection = class(Tcomponent), DataProvider соответственно является owner`ром Connection,  как сделать так чтоб DataProvider сохранял внутри себя Connection ?

Всего записей: 110 | Зарегистр. 15-12-2005 | Отправлено: 10:39 17-05-2006
dyr farot

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в смысле? все, что лежит на форме сохраняется в dfm. причем иерархия тоже сохраняется...

Всего записей: 697 | Зарегистр. 03-08-2004 | Отправлено: 13:47 17-05-2006
FRALX

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dyr farot
Сохраняется в случае если проперть не типа TComponent (сохраняется иерархия Parent`ов а не Owner`ов), а в случае c TComponent возникают проблемы. Tакого рода ссылки хранятся как имена и владельцем всех этих компонент должна быть TForm. А мне нужно чтоб владельцем была не форма а мой компонент

Всего записей: 110 | Зарегистр. 15-12-2005 | Отправлено: 15:26 17-05-2006 | Исправлено: FRALX, 15:30 17-05-2006
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
FRALX
Компоненту ты создаёш ручками (ну тоесть в Create родителя), поэтому для анализа, что нужно сохранять, делфа должна "запустить" компонент и посмотреть.
Поэтому предлагаю более простой способ. В родительском компоненте делаем свойство ConnectionString и может ещё какие-то (по необхдимости). Тепперь при создании компонента-родителя мы на основании этих свойств создаём компонент. А сам дочерний компонент можно в private вообще занести

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 16:11 17-05-2006
FRALX

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
  Мне просто хочется, чтоб все настройки бд были доступны в том виде как их предоставляет компонент доступа к данным, чтоб не заморачиваться на переписывание провайдера, при изменении компонента доступа к данным.
  На данный момент я нашел способ сохранять настройки компонента в бинарные проперти через DefinePropertyes. Немного не красиво в том смысле что дфм руками не поправить.    

Всего записей: 110 | Зарегистр. 15-12-2005 | Отправлено: 16:24 17-05-2006 | Исправлено: FRALX, 16:25 17-05-2006
reenoip



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Написал свой чудо-сервис. Здесь взял пример, как им можно управлять из другого приложения. Но в процессе компиляции возникает несколько предупреждений такого вида:

Код:
[Warning] Unit1.pas(166): Symbol 'RaiseLastWin32Error' is deprecated
. Приложение работает, всё нормально, но эти предупреждения раздражают, хоть и не мешают. Как их можно убрать? Листинг, повторюсь, здесь.

Всего записей: 1768 | Зарегистр. 10-03-2006 | Отправлено: 20:13 17-05-2006 | Исправлено: reenoip, 21:27 17-05-2006
OrlangurStep



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

Всего записей: 1392 | Зарегистр. 08-04-2006 | Отправлено: 21:28 17-05-2006
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
reenoip

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

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

Код:
procedure RaiseLastWin32Error; deprecated;  // use RaiseLastOSError

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 08:07 18-05-2006
FireZone

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OrlangurStep

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

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

Код:
procedure TStartForm.ExitClick(Sender: TObject);
begin
StartForm.Close
end;
лучше заменить на
Код:
procedure TStartForm.ExitClick(Sender: TObject);
begin
  Self.Close
end;
 
или
 
procedure TStartForm.ExitClick(Sender: TObject);
begin
  Close
end;
Иначе если ты решишь вдруг создать несколько экземпляров одной формы, у тебя будут проблемы. И вообще глобальные переменные для форм (за исключением главной формы),  которые создаёт среда лучше вообще убрать и при необходимости объявлять их там, где ты динамически создаёшь форму. Это из того, что бросилось в глаза. Глубже не вникал.

Всего записей: 293 | Зарегистр. 28-01-2004 | Отправлено: 09:43 18-05-2006
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
OrlangurStep
Посмотрел и я.
По воду динамического создания форм - полностю согласен с FireZone
Что за стремления к минимализму? У тебя что, разрешения экрана 100 на 75? Надо хоть чуточку больше.
У меня так и не получилось набрать не одного бала. Не знаю, вроде и рекция нормальная. Хотя вначале я пытался мышкой тыкать.
 
Когда появляется окошко ввода имени, я ничего не ввожу, но меня никак не ругают. Странно. А должны. А с другой стороны, зачем выводить окошко добавления результата, если у меня 0 очков?
Окошко "Остю время" у меня выглядит просто ужасно: на сером фоне (clBtnColor) цифры пишуться белым, а неподсвеченые сегменты - чёрным. Но при старте (в первую секунду)фон черный.
Символ диска на кнопке новой игры - сразу не догадался, благо подсказки есть. А вот иконка результатов - как раз подходит для новой игры.
Ещё писать или хватит?
 
Добавлено:

Код:
 
105:
  begin
  i1:= 0;
  i2:= 2;
  end;
33:
  begin
  i1:= 0;
  i2:= 2;
  end;
 

Не будь индусом (индустриальные програмисты, которым нужно количество строк кода а не качество)! Они работают копипастом.
Это же можно упростить, ну как минимум до

Код:
 
105,33:
  begin
  i1:= 0;
  i2:= 2;
  end;
 


----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 13:09 18-05-2006 | Исправлено: OdesitVadim, 13:15 18-05-2006
Sergey1970



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Существует ли в Win переменная среды или что-то, по которой можно было бы определить уникальность загруженной сессии операционнки? Что-то типа идентификатора сессии. Если есть - куда копать что бы его достать?

Всего записей: 55 | Зарегистр. 11-02-2003 | Отправлено: 15:18 18-05-2006
dyr farot

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
что ты понимаеш под сессией?

Всего записей: 697 | Зарегистр. 03-08-2004 | Отправлено: 17:02 18-05-2006
Sergey1970



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Время с начала работы операционной системы до ее останова. Мне необходимо идентифицировать была ли перезагрузка между двумя запусками моей программы. Или сколько раз была запущена моя программа в период без перезагрузки. Так же устроит идентификатор работы сеанса - без разницы.

Всего записей: 55 | Зарегистр. 11-02-2003 | Отправлено: 17:11 18-05-2006
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Так сразу написал бы,что хочеш сделать прогу, которая запускается только один раз за время работы винды.  

Код:
 
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;
 

Здесь создаются атом с именем THIS_IS_SOME_OBSCUREE_TEXT, если это первый запуск. Если при запуске он уже найден, то запуск не произойдёт. Атом не удаляется по завершению работы твоей программы. А по завершению работы винды - удаляется. Имя атома конечно лучше изменить.

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 17:28 18-05-2006
Sergey1970



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
OdesitVadim
Я не писал что "хочу написать прогу, которая..." Чес слово, не писал! :о)))
Просто спросил существует ли какой-то идентифкатор "сесии" Win?
 
За подсказку спасибо, как вариант я это рассматривал :о)

Всего записей: 55 | Зарегистр. 11-02-2003 | Отправлено: 17:42 18-05-2006
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Это определяется функцией GetTickCount.

----------
... не это главное ...

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 17:47 18-05-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2
ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru