Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C++ Builder / Delphi

Выпуск № 226
от 06.10.2003, 12:32

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 996
Отправлено ответов: 1962
Активность: 196.9 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Boriss
Статус: Начальный
Общий рейтинг: 144.82
[Подробней >>]
Marouder
Статус: Профессиональный
Общий рейтинг: 122.69
URL: Первый Хабаровский Форум
Телефон: (4212) 21-93-65
[Подробней >>]
sir henry
Статус: Доверительный
Общий рейтинг: 153.62
[Подробней >>]
 
Артём Шегеда
Статус: Профессиональный
Общий рейтинг: 116.91
URL: Пристанище неодинокого программиста
[Подробней >>]
Cybernetic Creature
Статус: Профессиональный
Общий рейтинг: 125.46
URL: В разработке
[Подробней >>]
Vdr
Статус: Опытный
Общий рейтинг: 110.23
[Подробней >>]
 
CJ
Статус: Доверительный
Общий рейтинг: 125
[Подробней >>]
THE_PRO
Статус: Доверительный
Общий рейтинг: 142.3
[Подробней >>]
Bob Johnson
Статус: Профессиональный
Общий рейтинг: 151.25
URL: Программирование
[Подробней >>]
 
ART_43
Статус: Опытный
Общий рейтинг: 122.01
URL: ART_43 Home Site
[Подробней >>]
kvINT
Статус: Профессиональный
Общий рейтинг: 104.32
Телефон: (34369)6-24-47
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 984. Здравствуйте, уважаемые коллеги. Не подскажете ли вы мне как мне узнать список Alies? Мне нужно что ... (ответов: 3)
Вопрос № 985. Не могли бы вы помочь мне сделать следующую программу: программа представляет из себя memo1+button1.... (ответов: 6)
Вопрос № 986. Здравствуйте Нужно в TListView залить фон каждого Item(а) определенным цветом? (Если можно кусочек к... (ответов: 4)
Вопрос № 987. Здравствуйте. Как можно в С++Builder в определенный момент работы программы, выйти из нее (аналог h... (ответов: 6)
Вопрос № 988. Здравствуйте, уважаемые эксперты! Не знаете ли вы, как добавить в (или удалить из) ссылку на своё пр... (ответов: 5)
Вопрос № 989. Здравствуйте ув. Эксперты! SpinEdit2.Value := SpinEdit2.Value + (SpinEdit1.Value)*0.01; ПО идее знач... (ответов: 10)
Вопрос № 990. 1. Я поставил глобальный хук на мышь. Как из lparam'a вытащить координаты мыши? GetMousePos не предл... (ответов: 2)
Вопрос № 991. Здраствуйте эксперты! В ComboBox добавил несколько строк. Проблема-надо сделать, чтоб КОМБО уже высв... (ответов: 6)
Вопрос № 992. Как через Delphi получить информацию о компьютере (частоте прцессора, установленных драйверах и т. д... (ответов: 4)

Вопросов: 9, ответов: 46


 Вопрос № 984

Здравствуйте, уважаемые коллеги.
Не подскажете ли вы мне как мне узнать список Alies? Мне нужно что бы юзер мог выбрать нужный из списка.
Заранее спасибо!



Вопрос отправлен: 01.10.2003, 13:37
Отправитель: VDR

[Следующий вопрос >>] [Список вопросов]

Отвечает Boriss

Здравствуйте, VDR!
У меня D5 и там такого нет. Что все-таки нужно? Alias? Уточните, пожалуйста

Ответ отправлен: 01.10.2003, 17:52
Отправитель: Boriss


Отвечает Marouder

Приветствую Вас, VDR!
Объясни сначала, что такое "Alies".

Ответ отправлен: 02.10.2003, 08:37
Отправитель: Marouder


Отвечает sir henry

Приветствую Вас, VDR!
Вы имели в виду ALIAS? Тогда вот процедура для этого:
procedure TForm1.Button1Click(Sender: TObject);
begin
DataModule2.Database1.session.GetDatabaseNames(ListBox1.Items);
end;
ListBox, естесственно, должен на форме уже присутствовать :).

Ответ отправлен: 01.10.2003, 14:57
Отправитель: sir henry


 Вопрос № 985

Не могли бы вы помочь мне сделать следующую программу:
программа представляет из себя memo1+button1.
В мемо ты вводишь текст какой-либо проги, например этот:
-----------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage ('Test') //test program
end;
end.
-----------------
Программа (при нажатии на button) должна заключить все зарезервированные Дельфи слова (Var,
begin, implementation...) в теги
таким образом у нас должно получиться следующее:
-------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage ('Test') //test program
end;
end.
-------------------
+ все комментарии прога должна выделять тегом
-------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage ('Test') //test program
end;
end.
-------------------
Я вроде бы сделал наброски, но единтвенный недостаток:
--------------------
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
form1.close; //вот и он!!!
end;
--------------------
Заранее благодарен!


Приложение:


Вопрос отправлен: 01.10.2003, 15:44
Отправитель: maDByte

[Следующий вопрос >>] [Список вопросов]

Отвечает sir henry

Здравствуйте, maDByte!
Наверное Вам, чтобы не вводить кучу новых зарезервированых слов, можно сделать выделение ВСЕГО слова до ближайшего пробела. Пробел будет признаком окончания зарезервированного слова. Таким образом, будут выделяться как Form, так и Form1, Form1.Close, Form1.Create, Form1.Button1.Click и т.д.

Ответ отправлен: 02.10.2003, 05:52
Отправитель: sir henry


Отвечает Артём Шегеда

Здравствуйте, maDByte!

Ох, наворотил...
Там, между прочим, ошибка не одна была...

Приложение:

Ответ отправлен: 01.10.2003, 18:26
Отправитель: Артём Шегеда


Отвечает Cybernetic Creature

Доброе время суток, maDByte!
Я так понял что у тебя изменяются только первые слова.
Можно сделать так: Заменить первое слово после редактирования.
например begin на ^^begin^^. И после окончания удалить все ^^ в тексте.

Ответ отправлен: 02.10.2003, 20:36
Отправитель: Cybernetic Creature


Отвечает Boriss

Доброе время суток, maDByte!
В чем проблема: после ключевого слова должен идти символ ' ', ',', ':', ...
Значит нужно проверять, что идет после. Например так:
CONST
TheChars: set of char = [' ', '.', #13, #10, ':'];
_pos:=pos (boldlist.strings[i1], s);
if (_pos<>0) and (_pos=1) or (s[_pos-1]='')
or (s[_pos+length(boldlist[i1])]='') and (s[_pos-1]=' ')
// !! НЕ or (s[_pos+length(boldlist[i1])]=' ') , А так:
OR (s[_pos + Length(boldlist.strings[i1])) in TheChars) // <-- !!
then begin ...

Ответ отправлен: 02.10.2003, 18:08
Отправитель: Boriss


Отвечает Vdr

Доброе время суток, maDByte!
Ты видимо не проверяешь символ идущий после найденой комбинации. Подумай какие могут идти символы после for? По идее их не много (Enter, пробел, скобка, табуляция)проверяй наличие именно этих символов и только тогда заключай слово в теги.
Удачи!

Ответ отправлен: 02.10.2003, 11:46
Отправитель: Vdr


Отвечает CJ

Добрый день, maDByte!
Это можно сделать только с RichEdit!!!
А он как известно глючный! Так что лучше писать свой!


Ответ отправлен: 03.10.2003, 20:50
Отправитель: CJ


 Вопрос № 986

Здравствуйте
Нужно в TListView залить фон каждого Item(а) определенным цветом?
(Если можно кусочек кода, или ссылку на компонент для C++ Builder 5.0)
Спасибо!!!



Вопрос отправлен: 01.10.2003, 17:10
Отправитель: Quas

[Следующий вопрос >>] [Список вопросов]

Отвечает Cybernetic Creature

Здравствуйте, Quas!
Вообше то я работаю с Делфями но можно перевести код на С++
я что то тут нахимичил не знаю будет работать или нет.
У меня билдера нет чтоб тестировать
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
ListBox1->Canvas->Font->Color=clLime;
ListBox1->Canvas->TextOut(Rect.Left, Rect.Top,ListBox1->Items[Index])
}

Приложение:

Ответ отправлен: 02.10.2003, 20:36
Отправитель: Cybernetic Creature


Отвечает sir henry

Доброе время суток, Quas!
Фон можно менять только у окна целиком. Честно говоря, я нигде не видел проги, в которой бы фон каждого Item'a был разным цветом :(

Ответ отправлен: 02.10.2003, 06:04
Отправитель: sir henry


Отвечает Артём Шегеда

Здравствуйте, Quas!

procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Node.Level<>0 then
TreeView1.Canvas.Brush.Color := $FFFFFF-Node.Level*$20
end;


Ответ отправлен: 01.10.2003, 18:33
Отправитель: Артём Шегеда


Отвечает THE_PRO

Добрый день, Quas!
Narisuy kartinku!

Ответ отправлен: 04.10.2003, 13:16
Отправитель: THE_PRO


 Вопрос № 987

Здравствуйте.
Как можно в С++Builder в определенный момент работы программы, выйти из нее
(аналог halt в Паскале)?
Спасибо.



Вопрос отправлен: 02.10.2003, 17:29
Отправитель: Zax

[Следующий вопрос >>] [Список вопросов]

Отвечает Marouder

Приветствую Вас, Zax!
По-разному можно. Можно exit, можно ExitProcess, можно Application.Terminate.



Ответ отправлен: 03.10.2003, 12:53
Отправитель: Marouder


Отвечает sir henry

Приветствую Вас, Zax!
abort() или exit()

Ответ отправлен: 03.10.2003, 09:13
Отправитель: sir henry


Отвечает Cybernetic Creature

Добрый день, Zax!
ExitProc
ExitCode
.......


Ответ отправлен: 02.10.2003, 20:36
Отправитель: Cybernetic Creature


Отвечает Bob Johnson

Добрый день, Zax!
1. Application.Terminate ();
2. ExitProcess (0);

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 02.10.2003, 19:20
Отправитель: Bob Johnson


Отвечает Boriss

Добрый день, Zax!
Для этого существует процедура
VOID PostQuitMessage(
int nExitCode // код выхода
);


Ответ отправлен: 02.10.2003, 17:53
Отправитель: Boriss


Отвечает THE_PRO

Добрый день, Zax!
Exit bez parametrov

Ответ отправлен: 04.10.2003, 13:10
Отправитель: THE_PRO


 Вопрос № 988

Здравствуйте, уважаемые эксперты!
Не знаете ли вы, как добавить в (или удалить из) ссылку на своё приложение? Желательно, чтобы работало на Windows NT, 2000, XP. Вапрос, конечно, не совсем по Delphi, но, надеюсь, вы мне поможете. (Мне нужно вынести в Control Panel ссылку на программу, производящую настройку другой программы).



Вопрос отправлен: 02.10.2003, 18:51
Отправитель: Кирилл

[Следующий вопрос >>] [Список вопросов]

Отвечает Boriss

Приветствую Вас, Кирилл!
В (куда), удалить из (откуда)? Программно на ControlBar кнопку?
Уточните, пожалуйста. Может нужно запустить программу?


Ответ отправлен: 03.10.2003, 13:57
Отправитель: Boriss


Отвечает Cybernetic Creature

Здравствуйте, Кирилл!
Попробуйте
File - New - Other - Control Panel Application
Надеюсь разберетесь

Ответ отправлен: 02.10.2003, 20:35
Отправитель: Cybernetic Creature


Отвечает Marouder

Доброе время суток, Кирилл!
Для Control Panel нужно создавать не обычную прогу, а Control Panel Application (File->New->Other...->Control Panel Application). А пример есть в директории "Demos\Cpl" в директории, где установлена Delphi.

Ответ отправлен: 03.10.2003, 12:53
Отправитель: Marouder


Отвечает CJ

Приветствую Вас, Кирилл!
Извините, но чуть-чуть не понятен вопрос!


Ответ отправлен: 03.10.2003, 20:51
Отправитель: CJ


Отвечает THE_PRO

Приветствую Вас, Кирилл!
Pishish CPL fayl i pomeshayesh ego v %windir%system.
-|-
CPL: File->New->Other->Applet

Ответ отправлен: 04.10.2003, 13:09
Отправитель: THE_PRO


 Вопрос № 989

Здравствуйте ув. Эксперты!
SpinEdit2.Value := SpinEdit2.Value + (SpinEdit1.Value)*0.01;
ПО идее значение SpinEdit2.Value должно становится: Значение SPinEdit2.Value+1 процент от значения SPinEdit1.Value.
Но делфи выдает:
Incompatible types: 'Integer' and 'Extended'
Че делать? заранее благодарю!



Вопрос отправлен: 02.10.2003, 21:24
Отправитель: elvis

[Следующий вопрос >>] [Список вопросов]

Отвечает ART_43

Добрый день, elvis!
SpinEdit2.Value := SpinEdit2.Value + Round((SpinEdit1.Value)*0.01);

Ответ отправлен: 03.10.2003, 09:14
Отправитель: ART_43


Отвечает Артём Шегеда

Приветствую Вас, elvis!

Насколько я понял, читатель решил ускорять наращивание SpinEdit.Value. Что касается преобразования типов, то тут другие эксперты помогут.
НО! При значении SpinEdit.Value<50 yb о каком приросте речи быть не может, поскольку после умножения на 0.01 получим значение менее 0.5, что после округления даст 0.

Сделай так:
SpinEdit2.Value := SpinEdit2.Value + 1 + (SpinEdit1.Value div 100);

Здесь нет ни преобразования типов, ни потери приращения при SpinEdit2.Value менее 50.
А ещё мне интересно, как читатель собирается реализовать уменьшение значения SpinEdit2.Value с аналогичным эффектом. ;)

Ответ отправлен: 03.10.2003, 12:11
Отправитель: Артём Шегеда


Отвечает sir henry

Доброе время суток, elvis!
Дык она Вам правильно пишет :)). У SpinEdit.Value - тип INTEGER, а у 0.01 тип EXTENDED. И результат в результате :) должен получиться типа EXTENDED, а Вы его пытаетесь засунуть в тип INTEGER.

Ответ отправлен: 03.10.2003, 11:06
Отправитель: sir henry


Отвечает Boriss

Доброе время суток, elvis!
Определено, что property Value: Integer; и Extended оно не станет, пока класс не перепишите.
Но, пожалуй, легче использовать что-нибудь другое. Что именно надо - надо знать, что за задача.


Ответ отправлен: 03.10.2003, 18:29
Отправитель: Boriss


Отвечает kvINT

Здравствуйте, elvis!
(SpinEdit1.Value)*0.01 - приводится к Extended, даже если у тебя было число, напр. 100. Напиши что-нибудь типа Integer(SpinEdit1.Value*0.01).


Ответ отправлен: 03.10.2003, 06:38
Отправитель: kvINT


Отвечает Marouder

Доброе время суток, elvis!
SpinEdit2.Value - это целое число,а SpinEdit1.Value*0.01 - с плавающей точкой.
Попробуй так:
SpinEdit2.Value := SpinEdit2.Value + trunc((SpinEdit1.Value)*0.01);

Ответ отправлен: 03.10.2003, 12:53
Отправитель: Marouder


Отвечает Bob Johnson

Добрый день, elvis!
Туда можно только целое число занести. Пиши .. + round (SpinEdit1.Value*0.01);

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 04.10.2003, 20:21
Отправитель: Bob Johnson


Отвечает CJ

Добрый день, elvis!
Здесь ты испльзуешь тип integer! А надо другой!


Ответ отправлен: 03.10.2003, 20:50
Отправитель: CJ


Отвечает Cybernetic Creature

Здравствуйте, elvis!
С двумя спинедитами ничего не получится. Потому что Value может иметь только целочисленые значения, можно воспользоватся Едитом.
................................
var a:Double;
................................
begin
a:=StrToFloat(Edit1.Text)+SpinEdit1.Value*0.01;
Edit1.Text:=FloatToStr(a)
end;
........................

Ответ отправлен: 05.10.2003, 14:29
Отправитель: Cybernetic Creature


Отвечает THE_PRO

Доброе время суток, elvis!
Pravilno dayet delfyara...
U tebya poluchayetsya chislo v rode *.****** a eto i yest Extended, a ne Integer!
Ili okruqlyay ili je...

Ответ отправлен: 04.10.2003, 12:55
Отправитель: THE_PRO


 Вопрос № 990

1. Я поставил глобальный хук на мышь. Как из lparam'a вытащить координаты мыши? GetMousePos не предлагать!
2. Дайте с примером детальное описание как пользоваться функцией ToAscii.
Заранее спасибо.
З.Ы. Все на Delphi!



Вопрос отправлен: 03.10.2003, 00:28
Отправитель: Inch (Inch@bratan.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Здравствуйте, Inch!
1. Там будет указатель на MOUSEHOOKSTRUCT. Сама структура в приложении.

* EMan1.5: ---===*** The game we play ***===---

Приложение:


Ответ отправлен: 04.10.2003, 20:22
Отправитель: Bob Johnson


Отвечает Boriss

Приветствую Вас, Inch!
2> Поищи хороший справочник delphistfaq.chm
Пример взят оттуда


Приложение:

Ответ отправлен: 03.10.2003, 13:42
Отправитель: Boriss


 Вопрос № 991

Здраствуйте эксперты!
В ComboBox добавил несколько строк.
Проблема-надо сделать, чтоб КОМБО уже высвечивало TEXT 'One',
а не синее выделение.Присвавание ComboBox1.text:='One';
Неработает.Можно выдивагать програмно список(чтоб юзер понял,что
надо обязательно выбрать )-но если челкуть по форме
-список убирается и остается пустым.
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.Add('One');
ComboBox1.Items.Add('Two');
ComboBox1.Items.Add('Three');
ComboBox1.Style:=csDropList;//(позволяет выбирать только из списка)
ComboBox1.text:='One';// Cтавим пункт по умолчанию===НЕРАБОТАЕТ
end;



Вопрос отправлен: 03.10.2003, 02:08
Отправитель: AllDer

[Следующий вопрос >>] [Список вопросов]

Отвечает Vdr

Добрый день, AllDer!
Дело в том, что значение отображаемое на текущий момент определяется свойством ItemIndex. По умолчанию оно равно -1, а массив Items начинается с 0...
Удачи!

Ответ отправлен: 03.10.2003, 11:11
Отправитель: Vdr


Отвечает kvINT

Добрый день, AllDer!
Сейчас Delphi под рукой нет, но помню, что нужно сделать примерно так ComboBox1.Items.Index := 1;


Ответ отправлен: 03.10.2003, 06:41
Отправитель: kvINT


Отвечает ART_43

Здравствуйте, AllDer!
Попробуй ComboBox1.ItemIndex:=0;

Ответ отправлен: 03.10.2003, 09:12
Отправитель: ART_43


Отвечает Marouder

Добрый день, AllDer!
Скорее всего, тебе поможет такой код:
ComboBox1.ItemIndex:=0;

Ответ отправлен: 03.10.2003, 12:52
Отправитель: Marouder


Отвечает Cybernetic Creature

Доброе время суток, AllDer!
ComboBox1.Items.Add('One');
ComboBox1.Items.Add('Two');
ComboBox1.Items.Add('Tre');
ComboBox1.Style:=csDropDownList;
ComboBox1.ItemIndex:=ComboBox1.Items.IndexOf('One')

Ответ отправлен: 05.10.2003, 14:29
Отправитель: Cybernetic Creature


Отвечает Bob Johnson

Приветствую Вас, AllDer!
Надо вроде ItemIndex присвоить номер выбранного пункта.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 04.10.2003, 20:23
Отправитель: Bob Johnson


 Вопрос № 992

Как через Delphi получить информацию о компьютере (частоте прцессора, установленных драйверах и т. д.)



Вопрос отправлен: 03.10.2003, 09:04
Отправитель: Talib

[Следующий вопрос >>] [Список вопросов]

Отвечает sir henry

Здравствуйте, Talib!
Нужно собрать в своей проге функции, которые собирают нужную инфу, например EnumDisplaySettings() - собирает инфу о том или ином режиме дисплея.

Ответ отправлен: 03.10.2003, 12:12
Отправитель: sir henry


Отвечает CJ

Приветствую Вас, Talib!
Либо пиши свой модуль, либо пробуй через реестр найти нужные ключи!


Ответ отправлен: 03.10.2003, 20:51
Отправитель: CJ


Отвечает Cybernetic Creature

Добрый день, Talib!
Разработаем программу, показывающую нам некоторую системную информацию о компьютере. В частности, хотелось бы получить информацию о версии ОС, ее директориях, свойствах экрана, ресурсах памяти, имени пользователя и компьютера, дате BIOS. Помимо этого, разрешим пользователю изменять настройки клавиатуры, встроенного динамика и хранителя экрана.
Процесс визуального проектирования описывать не будем; рассмотрим лишь страницу «Параметры». Для удобства управления параметрами клавиатуры положим на нее две компоненты TTrackBar. Изменим свойство Name на tbKeyboardDelay и tbKeyboardSpeed. Изменим свойство PageSize на 1. Для tbKeyboardDelay установим Max=3 и для tbKeyboardSpeed. Max=31. Для управления свойствами хранителя экрана используем TCheckBox (свойство Name сменим на cbScreenSaverActive, Caption на &‘Хранитель экрана&’) и TMaskEdit (свойство Name=&’edSSTimeOut&’ и EditMask=&’!999;1;&’). Аналогично добавим TCheckBox (свойство Name=&’cbSpeaker&’, Caption=&’Использование встроенного динамика&’ ).
Рассмотрим текст программы. В список включаемых модулей uses добавим registry. Добавим описание процедур в раздел public описания TfmMain.

type
TfmMain = class(TForm)
...
procedure FormCreate(Sender: TObject);
procedure Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
KeyboardDelay,
KeyboardSpeed,
ScreenSaveTimeOut : integer;
procedure ParametersInfo;
procedure ShowSomeInfo;
procedure BIOSInfo(OS : string);
procedure HardwareInfo;
procedure MemoryInfo;
procedure VideoInfo;
procedure OSInfo;
end;
var fmMain: TfmMain;
implementation
uses Registry;
{$R *.DFM}


Сначала получим информацию о компьютере. Используем функцию GetComputerName для получения имени компьютера, функцию GetUserName для получения имени пользователя и функцию GetSystemInfo для получения информации о процессоре (наиболее полно данная функция реализована в Windows NT, где она возвращает и кол-во процессоров и их тип и т.д.).

// Информация о компьютере.
procedure TfmMain.HardwareInfo;
var Size : cardinal;
PRes : PChar;
BRes : boolean;
lpSystemInfo : TSystemInfo;
begin
// Имя компьютера
Size := MAX_COMPUTERNAME_LENGTH + 1;
PRes := StrAlloc(Size);
BRes := GetComputerName(PRes, Size);
if BRes then laCompName_.Caption := StrPas(PRes);
// Имя пользователя
Size := MAX_COMPUTERNAME_LENGTH + 1;
PRes := StrAlloc(Size);
BRes := GetUserName(PRes, Size);
if BRes then laUserName_.Caption := StrPas(PRes);
// Процессор
GetSystemInfo(lpSystemInfo);
laCPU_.Caption := 'класса x' + IntToStr
(lpSystemInfo.dwProcessorType);
end;


Перейдем к параметрам экрану. Здесь мы будем использовать и Win32 API функции и стандартные объекты VCL. Так для получения разрешения экрана нам понадобится объект TScreen (его свойства Width и Height). Остальные параметры мы получим через контекст драйвера устройства DC используя функцию GetDeviceCaps.

// Информация о видеосистеме.
procedure TfmMain.VideoInfo;
var DC : hDC;
c : string;
begin
// Разрешение экрана
laWidth_.Caption := IntToStr(Screen.Height);
laHeight_.Caption := IntToStr(Screen.Width);
// Информация о глубине цвета.
DC := CreateDC('DISPLAY',nil,nil,nil);
laBitsPerPixel_.Caption :=
IntToStr(GetDeviceCaps(DC,BITSPIXEL));
laPlanes_.Caption :=
IntToStr(GetDeviceCaps(DC,PLANES));
case GetDeviceCaps(DC,BITSPIXEL) of
8 : c := '256 цветов';
15 : c := 'Hi-Color / 32768 цветов';
16 : c := 'Hi-Color / 65536 цветов';
24 : c := 'True-Color / 16 млн цветов';
32 : c := 'True-Color / 32 бит';
end;
laColors_.Caption := c;
DeleteDC(DC);
end;
Также будет интересна информация о памяти. Здесь нам поможет функция GlobalMemoryStatus, возвращающая информацию по объему физической и виртуальной памяти.
// Информация о памяти.
procedure TfmMain.MemoryInfo;
var lpMemoryStatus : TMemoryStatus;
begin
lpMemoryStatus.dwLength := SizeOf(lpMemoryStatus);
GlobalMemoryStatus(lpMemoryStatus);
with lpMemoryStatus do begin
laFreeMemory.Caption :=
laFreeMemory.Caption +
IntToStr(dwMemoryLoad) + '%';
laRAM_.Caption := Format('%0.0f Мбайт',
[dwTotalPhys div 1024 / 1024]);
laFreeRAM_.Caption := Format('%0.3f Мбайт',
[dwAvailPhys div 1024 / 1024]);
laPF_.Caption := Format('%0.0f Мбайт',
[dwTotalPageFile div 1024 / 1024]);
laPFFree_.Caption := Format('%0.0f Мбайт',
[dwAvailPageFile div 1024 / 1024]);
end;
end;


Узнаем информацию о ОС. Функция GetWindowsDirectory вернет путь к каталогу, где установлена система, функция GetSystemDirectory - к системному каталогу. Для определения версии ОС воспользуемся функцией GetVersionEx.

// Информация о Windows.
procedure TfmMain.OSInfo;
var PRes : PChar;
Res : word;
BRes : boolean;
lpVersionInformation : TOSVersionInfo;
c : string;
begin
// Каталог, где установлена Windows
PRes := StrAlloc(255);
Res := GetWindowsDirectory(PRes, 255);
if Res > 0 then laWinDir_.Caption :=
StrPas(PRes);
// Системный каталог Windows
Res := GetSystemDirectory(PRes, 255);
if Res > 0 then laSysDir_.Caption :=
StrPas(PRes);
// Имя ОС
lpVersionInformation.dwOSVersionInfoSize :=
SizeOf(TOSVersionInfo);
BRes := GetVersionEx(lpVersionInformation);
if BRes then
with lpVersionInformation do case dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS :
if dwMinorVersion=0 then c := 'Windows 95'
else c := 'Windows 98';
VER_PLATFORM_WIN32_NT : c := 'Windows NT';
VER_PLATFORM_WIN32s : c := 'Win 3.1 with Win32s'
end;
laVersion_.Caption := c;
// Дата создания BIOS-а
if c='Windows NT' then BIOSInfo('NT') else BIOSInfo('95');
end;


В предыдущем отрывке программы внимательный читатель заметил вызов функции BIOSInfo с параметром, характеризующем текущую ОС. Опишем эту функцию. Важно отметить, что способ получения информации о дате BIOS различен. Для NT получим информацию из реестра, а для Windows 95/98 из соответствующего участка памяти. Эти два способа взаимоисключаемы, так как у Windows 95/98 нет соответствующего раздела реестра, а прямой доступ к памяти в NT невозможен.

// Информация о дате создания BIOS-а.
procedure TfmMain.BIOSInfo(OS : string);
var p : pointer;
s : string[255];
begin
if OS='NT' then begin with TRegistry.Create do
try RootKey := HKEY_LOCAL_MACHINE;
if OpenKeyReadOnly
('HARDWAREDESCRIPTIONSystem')
then laBIOSDate_.Caption :=
ReadString('SystemBiosDate')
finally Free;
end;
end
else try
s[0] := #8;
p := Pointer($0FFFF5);
Move(p^,s[1],8);
laBIOSDate_.Caption :=
copy(s,1,2) + '/' + copy(s,4,2) + '/' +copy (s,7,2);
except laBIOSDate_.Caption := 'XX.XX.XXXX';
end;
end;


Рассмотрим функцию SystemParametersInfo, которая позволяет управлять некоторыми настройками системы. Область применения данной функции для NT и Windows 95/98 различна. Умышленно выберем некоторую общую часть для обеих систем.

// Информация о параметрах
procedure TfmMain.ParametersInfo;
var Bl : boolean;
begin
// Разрешен ли PC Speaker
SystemParametersInfo(SPI_GETBEEP,0,@Bl,0);
cbSpeaker.Checked := Bl;
// Активен ли хранитель экрана
SystemParametersInfo
(SPI_GETSCREENSAVEACTIVE,0,@Bl,0);
cbScreenSaverActive.Checked := Bl;
// Интервал вызова хранителя экрана
SystemParametersInfo
(SPI_GETSCREENSAVETIMEOUT,0,
@ScreenSaveTimeOut,0);
// Настройки клавиатуры
SystemParametersInfo
(SPI_GETKEYBOARDDELAY,0,
@KeyboardDelay,0);
SystemParametersInfo
(SPI_GETKEYBOARDSPEED,0,
@KeyboardSpeed,0);
end;
// Отображение настроек
procedure TfmMain.ShowSomeInfo;
begin
tbKeyboardDelay.Position := 3 - KeyboardDelay;
tbKeyboardSpeed.Position := KeyboardSpeed;
edSStimeOut.EditMask := IntToStr
(ScreenSaveTimeOut div 60);
end;


Также позволим пользователю изменять и сохранять настройки системы по своему вкусу. Здесь также будем использовать функцию SystemParametersInfo. Для компонентов tbKeyboardSpeed, tbKeyboardDelay, cbScreenSaverActive, cbSpeaker, edSSTimeOut в ObjectInspector перейдем на закладку Events и изменим событие OnChange (для tbKeyboardSpeed, tbKeyboardDelay) , OnClick (для cbScreenSaverActive, cbSpeaker) и OnExit для edSSTimeOut на Change. Таким образом, все пять вышеперечисленных компонент после изменений состояний передадут управление нижеприведенной процедуре.

// Сохранение изменений параметров системы
procedure TfmMain.Change(Sender: TObject);
var Sen : TComponent;
begin
Sen := Sender as TComponent;
// Вкл/Выкл PC Speaker-а.
if (Sen.Name='cbSpeaker') and cbSpeaker.Checked
then SystemParametersInfo
(SPI_SETBEEP,1,nil,SPIF_UPDATEINIFILE)
else SystemParametersInfo
(SPI_SETBEEP,0,nil,SPIF_UPDATEINIFILE);if (Sen.Name='cbScreenSaver') and cbScreenSaverActive.Checked
then SystemParametersInfo
(SPI_SETSCREENSAVEACTIVE,1,nil,SPIF_UPDATEINIFILE)
else SystemParametersInfo
(SPI_SETSCREENSAVEACTIVE,0,nil,SPIF_UPDATEINIFILE);
if (Sen.Name='tbKeyboardDelay') then SystemParametersInfo(
SPI_SETKEYBOARDDELAY,3-tbKeyboardDelay.Position,nil,
SPIF_SENDWININICHANGE);
if (Sen.Name='tbKeyboardSpeed') then SystemParametersInfo(
SPI_SETKEYBOARDSPEED,tbKeyboardSpeed.Position,nil,
SPIF_SENDWININICHANGE);
if (Sen.Name='edSSTimeOut') then SystemParametersInfo(
SPI_SETSCREENSAVETIMEOUT,StrToInt(edSSTimeOut.Text)
*60,nil,SPIF_UPDATEINIFILE);
end;
И ,наконец, вызовем все эти процедуры при создании формы.
procedure TfmMain.FormCreate(Sender: TObject);
begin
HardwareInfo;
MemoryInfo;
VideoInfo;
ParametersInfo;
ShowSomeInfo;
OSInfo;
end;

Ответ отправлен: 05.10.2003, 14:31
Отправитель: Cybernetic Creature


Отвечает THE_PRO

Здравствуйте, Talib!
Вычисление тактовой частоты процессора :
function GetCPUSpeed: double;
const
DelayTime = 500; // время измерения в миллисекундах
var
TimerHi, TimerLo: DWORD;
PriorityClass, Priority: integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
Result := TimerLo / (1000.0 * DelayTime);
end;
begin
LabelCPUSpeed.Caption := Format('CPU speed: %f MHz', [GetCPUSpeed]);
end;


Ответ отправлен: 04.10.2003, 12:46
Отправитель: THE_PRO



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (31)
C / C++ (27)
Perl (7)
Builder / Delphi (21)
Pascal (24)
Basic / VBA (8)
Java / JavaScript (10)
PHP (13)
Криптография (9)
WinAPI (14)
Пользователю
Windows 95/98/Me (56)
Windows NT/2000/XP (63)
"Железо" (42)
Поиск информации (27)
Администратору
Windows NT/2000/XP (33)
Linux / Unix (14)
Юристу
Гражданское право (11)
Семейное право (8)
Трудовое право (9)
КоАП (8)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное