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.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту 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.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||