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

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


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


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

Выпуск № 225
от 04.10.2003, 12:30

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


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

sir henry
Статус: Доверительный
Общий рейтинг: 157.81
[Подробней >>]
THE_PRO
Статус: Доверительный
Общий рейтинг: 136.48
[Подробней >>]
ART_43
Статус: Опытный
Общий рейтинг: 122.36
URL: ART_43 Home Site
[Подробней >>]
 
Marouder
Статус: Профессиональный
Общий рейтинг: 122.88
URL: Первый Хабаровский Форум
Телефон: (4212) 21-93-65
[Подробней >>]
Boriss
Статус: Начальный
Общий рейтинг: 145.83
[Подробней >>]
URiS
Статус: Профессиональный
Общий рейтинг: 125
URL: Бесплатный любительский софт, игры
[Подробней >>]
 
_vt
Статус: Профессиональный
Общий рейтинг: 122.4
[Подробней >>]
Bob Johnson
Статус: Профессиональный
Общий рейтинг: 151.26
URL: Программирование
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.08
[Подробней >>]
 
CJ
Статус: Доверительный
Общий рейтинг: 126.78
[Подробней >>]
Cybernetic Creature
Статус: Профессиональный
Общий рейтинг: 125.07
URL: В разработке
[Подробней >>]
Артём Шегеда
Статус: Профессиональный
Общий рейтинг: 116.93
URL: Пристанище неодинокого программиста
[Подробней >>]


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

Вопрос № 975. Здравствуйте, Уважаемые Эксперты. Возникла такая проблема: мне нужно перевести таблицы .db в SQL. Дл... (ответов: 3)
Вопрос № 976. Здравствуйте, уважаемые эксперты !!! 1) А есть ли у DBGridа какие-нибудь свойства наподобие PickList... (ответов: 5)
Вопрос № 977. Здорово братаны По моему меня не поняли в связи с вопросом №953 так вот эксперт _vt: Устоновил таки ... (ответов: 5)
Вопрос № 978. Здравствуйте! Подскажите, плз,как правильно через TADOQuery выполнить интструкцию INSERT(я прошу при... (ответов: 4)
Вопрос № 979. дравствуйте Эксперты! Подскажите, возможно ли засунуть программу в *.res, в дальнейшем запустить её ... (ответов: 7)
Вопрос № 980. Здравствуйте Гспода Эксперы! Это крик души - не бросайьте в рассылсу. ============== Хочу вначале вы... (ответов: 2)
Вопрос № 981. Dobriy den sutok, doroqiye X-Perti. Yest vot takaya problema, ne moqu vicheslit staj. Vot to chto ya... (ответов: 5)
Вопрос № 982. Здрасте эксперты. Дайте пожалста пример глобального клавиатурного хука на Delphi ну или док-цию. На ... (ответов: 2)
Вопрос № 983. Здорова, коллеги! Есть вопрос. Как в стандартном TPopupMenu сделать так, чтобы оно не скрывалось пр... (ответов: 3)

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


 Вопрос № 975

Здравствуйте, Уважаемые Эксперты.
Возникла такая проблема: мне нужно перевести таблицы .db в SQL. Для этого мне надо как-то узнавать список таблиц (в компоненте Database задается alies каталога где лежат таблицы) и список полей в таблице (их названия и свойства).
Заранее спасибо!



Вопрос отправлен: 29.09.2003, 12:31
Отправитель: VDR

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

Отвечает sir henry

Здравствуйте, VDR!
1. У компонента TDatabase есть свойство Directory - это каталог, где лежат таблицы (Paradox, dBase, FoxPro). На основе его и FindFirst-FindNext можно создать список названий таблиц.
2. У TTable есть свойство FieldDefs, в котором и содержаться все св-ва полей.
TFieldDefs.Count - кол-во полей
TFieldDefs.Items[].DataType - тип поля
TFieldDefs.Items[].Name - имя поля
TFieldDefs.Items[].Size - размер поля
Items - это массив полей, нужно будет указывать номер поля.

Ответ отправлен: 30.09.2003, 07:45
Отправитель: sir henry


Отвечает THE_PRO

Приветствую Вас, VDR!
ya tochno ne pomnu no tam yest chto to vrode Fileds... tipa TStrings chto i dayet otvet na tvoy vopros

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


Отвечает ART_43

Добрый день, VDR!
Если через ADO, dbExpress или BDE то
GetTableNames
GetFieldNames
Если через что-то другое, смотри похожие процедуры

Ответ отправлен: 29.09.2003, 16:00
Отправитель: ART_43


 Вопрос № 976

Здравствуйте, уважаемые эксперты !!!
1) А есть ли у DBGridа какие-нибудь свойства
наподобие PickList ??? Ну там не только выпадающий
список, а какой-нибудь переключатель.
2) Как можно записать обычный текстовый файл, так
чтобы при просмотре его нельзя было прочитать обычному
пользователю, а только мне ?? То есть речь идет о
простейшем кодировании и декодировании.
3) Помогите реализовать такую штуку: в ini-файл в секцию
City мне нужно из базы данных записать названия городов,
а потом их также считать от туда, например в ListBox ???
Мне не хочется создавать отдельный текстовый файл.
См. приложение.
Заранее большое спасибо. С уважением SATAN aka NAPALM.


Приложение:


Вопрос отправлен: 29.09.2003, 12:55
Отправитель: SATAN aka NAPALM

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

Отвечает sir henry

Приветствую Вас, SATAN aka NAPALM!
1. У TDBGrid такого нет, а у TColumn есть. TColumn.Buttonstyle="(cbsAuto," cbsEllipse, cbsNone). Первое значение - это раскрывающийся список, последнее - ничего нет :), при среднем - вызывается OnEditButtonClick и там описываешь любые действия.
2. Можешь его побуквенно зашифровать с помощью XOR, например: буква XOR пароль. Расшифровывать точно так-же: буква XOR пароль.
3. var
ini: TIniFile;
...
{Создание файла}
ini.Create(Имя_файла);
{Запись значения}
ini.Write{bool|integer|string}(Название_секции, название_параметра, значение);
{Считывание значения}
Переменная:=ini.Read{bool|integer|string}(Название_секции, название_параметра, значение_по_умолчанию);
Значение по умолчанию выдается, если не существует такой секции или параметра.

Ответ отправлен: 30.09.2003, 07:24
Отправитель: sir henry


Отвечает THE_PRO

Добрый день, SATAN aka NAPALM!
1)Da yest, no mojno ispolzovat i LookUP Fields
Dlya etoqo ti doljen znat chto takoye relyatseonniye DB
2)Texnika takaya:
var f,d:file of byte;
a,b:byte
begin
//...
while not eof(f) do
begin
read(f,a);
//...delayem chto to s peremennoy a
b:=a;
write(d,b);
//...
end;
end;
3)Dayesh obichniy "select" a potom... u DBGrid yest
svoystvo Cols, Rows tipa TStrings...
nu dalshe ne trudno... pomoyemu!

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


Отвечает Marouder

Здравствуйте, SATAN aka NAPALM!
2) Самое простое (проще некуда): пройтись в цикле по всем символам этого текста и изменить их на какую либо величину. Потом записывать в файл. Один из самых примитивных способов шифрования. Вот тебе 2 функции для шифрования-расшифрования:
function CryptString(s:string):string;//зашифровать
var x:integer;
begin
for x:=1 to Length(s) do
s[x]:=Char(Integer(s[x])+15);
result:=s;
end;
function DecryptString(s:string):string;//расшифровать
var x:integer;
begin
for x:=1 to Length(s) do
s[x]:=Char(Integer(s[x])-15);
result:=s;
end;
3) Есть простой класс для работы с Ini-файлами - TIniFile. Объявлен в модуле IniFiles. В справке достаточно подробно описана работа с ним. Разберись с ним сам - полезнее для здоровья. :) Не разберешься - обращайся, поможем.

Ответ отправлен: 30.09.2003, 10:33
Отправитель: Marouder


Отвечает Boriss

Здравствуйте, SATAN aka NAPALM!
1) Переключатель чего?
2) Обычное XOR. Открываешь как нетипизированный, считываешь, выполняешь операцию XOR с ключом и
записываешь обратно. По-моему, удобно первыми байтами какой набор символов, который для программы декодировщика -
сигнал, что зашифрован уже.
Надо оформить property для таких файлов и в Read - метод, который выполняет все. И заполняет список
расшифрованными данными. Аналогично Write - шифрует. Тогда у Вас, все O'k, у других набор.
Только где-то ключ хранить и менять. Вообще-то такое кодирование не очень сложно "разгрызть"
3) В чем проблема, не совсем ясно, так надо делать все построчно. И искать ключевое слово [City] и считывать, и аналогично записывать


Ответ отправлен: 29.09.2003, 15:44
Отправитель: Boriss


Отвечает URiS

Добрый день, SATAN aka NAPALM!
2) Кодирование - очень простая вещь, основанная по большому счёту на простейших арифметических операциях. У меня на сайте есть исходники CodeC'а.

Expert: URiS


Ответ отправлен: 30.09.2003, 17:51
Отправитель: URiS


 Вопрос № 977

Здорово братаны
По моему меня не поняли в связи с вопросом №953
так вот эксперт _vt: Устоновил таки кириллицу :)
а на счет вопроса: Братан а ты думаешь чем я переводил
мне нужно сделать меню как в некоторых прогах чтоб например если выбрать русский все меню были русские типа Файл Правка итд итп.
выбрал Инглиш а там File Edit Ну и так далее. все необхадимые ресурсы есть. а то что делфи не идеал это ты и прав и не прав потому что если знать делфи полностю что практически не возможно то такую №;%: можно сотворить.
эксперт CJ: Вопрос не о том.
эксперт URIS: Братуха ты тоже не понял меня. У меня все есть только нужно их добавить в прогу.
а как ты догодался что это на Азербайджанском?
транслит: Братуха пожалуйста не отвечай на данный вопрос. все равно ты ответа не знаешь на мороч мне голову
THE_PRO Это мой Брат. Я ему расказал о данном сайте и он тоже захотел стать экспертом.
в папке демос есть прога RichEdit. там типа такого что то есть но я Не догнал примерный код. Может кто то поймет и поможет.




Вопрос отправлен: 29.09.2003, 15:16
Отправитель: Cybernetic Creature

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

Отвечает THE_PRO

Приветствую Вас, Cybernetic Creature!
Ey, ti - "SIKRICHƏ[CCreature]" //Na obijatsya...shutka
Otkuda ti znayesh chto ya ne znayu...
Texnika: v *.res fayle, v stringtable perevodish vse slova,
a potom ix uzayesh!

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


Отвечает sir henry

Доброе время суток, Cybernetic Creature!
В примере к RichEdit сделано три формы, для разных языков своя форма.

Ответ отправлен: 30.09.2003, 07:00
Отправитель: sir henry


Отвечает Marouder

Приветствую Вас, Cybernetic Creature!
Блин, а что там непонятного? Там же исходники есть и все там написано, как это делать. В модуле Reinit.pas объявлены все функции типа LoadNewResourceModule и ReinitializeForms. Эти функции и используй.

Ответ отправлен: 30.09.2003, 10:33
Отправитель: Marouder


Отвечает _vt

Доброе время суток, Cybernetic Creature!
> Братан а ты думаешь чем я переводил
Не знаю :)
> мне нужно сделать меню как в некоторых прогах чтоб например
Я тебя прекрасно понял еще в первый раз... Если не сообразишь, что делать - пиши мне, вышлю пример...
> если знать делфи полностю что практически не возможно то такую №;%: можно сотворить.
Я дельфи не знаю, но сотворить могу всё... Дело во времени и необходимой литературе...
> URIS: а как ты догодался что это на Азербайджанском?
Не знаю как он, а я родился в Баку... Сразу предупреждаю, азербайджанский не знаю...

*** E-Man 1.5 (edition 04) - life is just a game...if you a student:) ***


Ответ отправлен: 29.09.2003, 18:00
Отправитель: _vt


Отвечает URiS

Здравствуйте, Cybernetic Creature!
Я тебя понял более чем правильно.
С помощью TAG очень удобно менять Caption'ы, мне иногда кажется, что он для этих целей и был создан.
Если тебе нужны подробности РЕАЛИЗАЦИИ этого, то обращайся ко мне лично на мыло.
а как ты догодался что это на Азербайджанском?

Я не догадался, я его знаю :) (шутка)

Expert: URiS


Ответ отправлен: 30.09.2003, 17:50
Отправитель: URiS


 Вопрос № 978

Здравствуйте!
Подскажите, плз,как правильно через TADOQuery выполнить интструкцию INSERT(я прошу пример), а то у меня хоть и добавляются строки в таблицу всё время вылазит какой-то эксепшен...типа
Command text doesn't return a result set.
заранее спасибо.



Вопрос отправлен: 29.09.2003, 15:19
Отправитель: Дима

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

Отвечает THE_PRO

Приветствую Вас, Дима!
SQL:> select * from users;
ili je
SQL:> select * from ADOdb.ADOTable;

Приложение:

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


Отвечает sir henry

Здравствуйте, Дима!
MySQLInsert:='INSERT INTO mytable (field1, field2) VALUES (data1, data2)';
MyADOQuery.ExecSQL(MySQLInsert);

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


Отвечает ART_43

Здравствуйте, Дима!
В ADO INSERT надо делать через TADOCommand

Ответ отправлен: 29.09.2003, 15:34
Отправитель: ART_43


Отвечает Bob Johnson

Доброе время суток, Дима!
Насколько я понимаю, надо использовать метод ExecSQL вместо Open в случае, если выполняемый запрос не возвращает результата.

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


Ответ отправлен: 01.10.2003, 00:18
Отправитель: Bob Johnson


 Вопрос № 979

дравствуйте Эксперты!
Подскажите, возможно ли засунуть программу в *.res, в дальнейшем запустить её из приложения
загрузив в память (не сохраняя на диске), и подождать пока она завершится?
Заранее спасибо.
Вопрос отправлен: 28.09.2003, 22:42
Отвечает CJ
Доброе время суток, Игорь!
Конечно можно!
Эксперт: CJ
Ответ отправлен: 29.09.2003, 14:40
Дата регистрации эксперта: 17.09.2003
Статус эксперта: Начальный
Получено вопросов: 40
Отправлено ответов: 10
Благодарностей: 0
Критики: 0
Общий рейтинг: 122.5
Беларусь, Гомель

Ребята, Вы издеваетесь?



Вопрос отправлен: 29.09.2003, 23:39
Отправитель: Игорь (firemen01@ukr.net)

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

Отвечает vitya

Добрый день, Игорь!
Сам я на данный вопрос промолчал, так как не занимался не знаю - но ответ (правильный он или нет) - точно отвечает на твой вопрос... :) Другого и не подразумевалось, кроме да/нет... :)

Ответ отправлен: 30.09.2003, 08:10
Отправитель: vitya


Отвечает THE_PRO

Приветствую Вас, Игорь!
A ved on prav, eto mojno sdelat...
tolko vot kak sdelat doljen skazat tot kto znayet navernika
...ya tochno ne znayu... no yesli xochesh mojesh mne
napisat na email:ocp@mail.az i ya tebe otvechu.
Prosto to chto ya tebe skaju yeshe nujno proverit... na
chto u menya net vremeni na danniy moment... i poetomu ya
ne xochu chto bi eto publikovalos na rassilke!
THE_PRO: ocp@mail.az

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


Отвечает sir henry

Приветствую Вас, Игорь!
В ресурс можно засунуть:
1. Окно
2. Кнопку
3. Меню
4. Рисунок
и т.п.
В общем вывод такой: ресурс - это файл для данных :).

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


Отвечает Boriss

Доброе время суток, Игорь!
А зачем это может быть нужно? По-моему, это самый главный вопрос прежде чем начинать что-то делать

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


Отвечает CJ

Добрый день, Игорь!
Не парень, ну ты вопрос ставь правильно!
Ты спросил "Можно ли?"
Я ответил, что можно!


Ответ отправлен: 30.09.2003, 16:00
Отправитель: CJ


Отвечает URiS

Доброе время суток, Игорь!
А ты обрати внимание на статус. :)
Конечно, мы все тут прикалываемся! Что ты думал мы тут сидим? :)
По-моему, сделать то, что тебе нужно очень сложно или даже невозможно, легче будет её сохранить где-нибудь.

Expert: URiS


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


Отвечает Cybernetic Creature

Здравствуйте, Игорь!
Я тут покопалься у себя и нашел вот что. не знаю поможет или нет.
Добавить EXE файл в своё приложение и запустить его
--------------------------------------------------------------------------------

1. Start notepad and create a .rc-file that looks like this:
Starte Notepad und erstelle ein .rc-file, das etwa so aussieht:

TESTFILE EXEFILE C:WindowsNotepad.exe


(Make sure that the Path to your Exe-File is correct!)
(Stelle sicher, dass der Pfad zur Exe-Datei korrekt ist!)
2. Save it as myres.rc
Speichere es als myres.rc
3. Compile the file with brcc32.exe
(in your Delphi-bin directory) to get myres.res
Kompiliere die Datei mit brcc32.exe
(Im Delphi-bin Verzeichnis) um die Datei myres.res zu erhalten.
4. Copy myres.res to your Project directory.
Kopiere myres.res in das entsprechende Projekt-Verzeichnis.
5. In your unit write the following:
In der unit, schreibe etwa das folgende:

var
Form1: TForm1;
NOTEPAD_FILE: string;
implementation
{$R *.DFM}
{$R MYRES.RES}
function GetTempDir: string;
var
Buffer: array[0..MAX_PATH] of Char;
begin
GetTempPath(SizeOf(Buffer) - 1, Buffer);
Result := StrPas(Buffer);
end;
// Extract the Resource
function ExtractRes(ResType, ResName, ResNewName: string): Boolean;
var
Res: TResourceStream;
begin
Result := False;
Res := TResourceStream.Create(Hinstance, Resname, PChar(ResType));
try
Res.SavetoFile(ResNewName);
Result := True;
finally
Res.Free;
end;
end;
// Execute the file
procedure ShellExecute_AndWait(FileName: string);
var
exInfo: TShellExecuteInfo;
Ph: DWORD;
begin
FillChar(exInfo, SizeOf(exInfo), 0);
with exInfo do
begin
cbSize := SizeOf(exInfo);
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := GetActiveWindow();
ExInfo.lpVerb := 'open';
lpFile := PChar(FileName);
nShow := SW_SHOWNORMAL;
end;
if ShellExecuteEx(@exInfo) then
begin
Ph := exInfo.HProcess;
end
else
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
Application.ProcessMessages;
CloseHandle(Ph);
end;
// To Test it
procedure TForm1.Button1Click(Sender: TObject);
begin
if ExtractRes('EXEFILE', 'TESTFILE', NOTEPAD_FILE) then
if FileExists(NOTEPAD_FILE) then
begin
ShellExecute_AndWait(NOTEPAD_FILE);
ShowMessage('Notepad finished!');
DeleteFile(NOTEPAD_FILE);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
NOTEPAD_FILE := GetTempDir + 'Notepad_FROM_RES.EXE';
end;
Администратору (госп. Калашников):
Я на счет таких експертов как CJ.
Да он ничего не знае и мямлит. Я подписан в вашу рассылку, и мне как подписчику не нравится это. может произвести сокрашение. но не по рейтингу а по качеству ответов.


Ответ отправлен: 30.09.2003, 22:32
Отправитель: Cybernetic Creature


 Вопрос № 980

Здравствуйте Гспода Эксперы!
Это крик души - не бросайьте в рассылсу.
==============
Хочу вначале выразить благодарность Бобу Джонсону - не вздумай соскакивать, -
тебе всегда пиво нальют..., и какому-то МЕЧУ (хотя он пропал), - простите остальные!
Хоть вы и не разу не дали на мои вопросы ответ - один хер, я научился от Вас многое -
хотя бы "Бросай куритить!"
Теперь о главном:
Добил я всё-таки создание LG караоке дсика! :)
Осталась одна проблема - некоторые караоке (из которых я и делаю новые композиции) -
центр не воспроизводит. т.е. - идёт один текст без музыки.
Я понимаю, это не в тему, но Вы же таланты, может кто и подскажет.
Жалко бросать, я два месяца потратил на изучение этого сраного формата LG.
В основном центр LG мои новые композиции красиво делает, но, попадаются караоке
(www.karaoke.ru - например "Чайная роза" Киркорова) которые центр LG не воспроизводит, т.е.
идёт один текст без музыки.
Это и правда крик души, - как я только не конвертировал midi!!!
У меня мысль, что у LG - GM формат, а последние караоке с XG.
Любые советы, пожалуйста, я в тупике пока.
Извините, кто не понял вопроса.
P.S.
Bob - не покидай рассылку, хотя может быть многие и будут рады...:(
Оставайся, - ты нужен, - я не ради своего вопроса, - знаю, ни кто не ответит.
Ты вообще АСС, главное - не зазнавайся.
Извините ребята, я впорол последнюю болванку - не пошло. вот с горя и пишу.
Центр вообще красиво всё сделал (как я и собрал, хотя коды Рида Соломона просил - но ни кто мне не дал),
особенно под Сердючку напелся(ился) и пишу. Bob, добавь - "кончай пить!".
firemen01@ukr.net



Вопрос отправлен: 29.09.2003, 23:37
Отправитель: Игорь

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

Отвечает URiS

Здравствуйте, Игорь!
> Это крик души - не бросайьте в рассылсу.
Да ладно! Как мы можем не дать человеку высказаться?!
Мне нравятся такие эмоциональные письма...
--
Я предлагаю тебе забить на центр. Слушай музыку в MP3!
--
> P.S.
> Bob - не покидай рассылку, хотя может быть многие и будут рады...:(
Я не буду рад. Я буду просто очень не рад. А что, он сказал, что уходит навсегда? :)
> Оставайся, - ты нужен, - я не ради своего вопроса, - знаю, ни кто не ответит.
Никуда Боб отсюда не денется! Пусть только попробует! Кто нам новые версии EMan будет делать тогда?
> Ты вообще АСС, главное - не зазнавайся.
Поздно ты это ему сказал. :)

Expert: URiS


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


Отвечает Bob Johnson

Доброе время суток, Игорь!
На раз уж URiS...
> Bob - не покидай рассылку, хотя может быть многие и будут рады...:(
Неужели со стороны все так плохо ? :)
> Оставайся, - ты нужен, - я не ради своего вопроса, - знаю, ни кто не ответит
Я пока уходить еще не собирался... Но ведь это не полностью зависит от моего желания...
> Отвечает URiS
> Никуда Боб отсюда не денется! Пусть только попробует! Кто нам новые версии EMan будет делать тогда?
Ну-ну :) А EMan может вполне оказаться в прошлом, если всю систему действительно переделают. Так что боритесь с обновлением rusfaq (старый друг лучше новых двух, вроде так)! Т.к. у меня вряд ли будет столько свободного времени, чтобы его переписать. А самому без e-man тоже будет мягко сказать нехорошо...
> Поздно ты это ему сказал. :)
Разве это зависит от того, как скоро тебе об этом скажут :) ?

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


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


 Вопрос № 981

Dobriy den sutok, doroqiye X-Perti.
Yest vot takaya problema, ne moqu vicheslit staj.
Vot to chto ya sam napisal:
function SDCMain(yearB,yearN,monthB,monthN,dayB,dayN:Integer):String;
var y,m,d:Integer;
resultStr:string;
begin
y:=yearN-yearB;
if monthBif monthB>monthN then begin
m:=monthN+12-monthB;
dec(y);
end;
if monthB=monthN then m:=0;
if dayBif dayB>dayN then
begin
if monthN=(1 or 3 or 5 or 7 or 8 or 10 or 12) then begin dayN:=dayN+31; dec(m); end;
if monthN=(4 or 6 or 9 or 11) then begin dayN:=dayN+30; dec(m); end;
if monthN=2 then begin if yearN mod 4=0 then dayN:=dayN+29 else dayN:=dayN+28; dec(m); end;
d:=dayN-dayB;
end;
if dayB=dayN then d:=0;
//Result:
if StrLen(pchar(IntToStr(d)))<2 then resultStr:='0'+IntToStr(d)+'.';
if StrLen(pchar(IntToStr(m)))<2 then resultStr:=resultStr+'0'+IntToStr(m)+'.';
if StrLen(pchar(IntToStr(y)))<2 then resultStr:=resultStr+'0'+IntToStr(y);
result:=resultStr;
end;
No pochemu to etot alqoritm dayet oshibku.
Proshu pomoshi...


Приложение:


Вопрос отправлен: 30.09.2003, 09:23
Отправитель: THE_PRO (ocp@mail.az)

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

Отвечает Cybernetic Creature

Доброе время суток, THE_PRO!
Алгоритм подсчёта времени, которое ушло на какую-либо операцию
--------------------------------------------------------------------------------
var
OperBegin, OperEnd: TTimeStamp;
Total: LongWord;
begin
OperBegin := DateTimeToTimeStamp(Now); {запоминается момент начала операции}
{Здесь размещается код операции}
OperEnd := DateTimeToTimeStamp(Now); {запоминается момент окончания операции}
Total := OperEnd.Time - OperBegin.Time;
end;


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


Отвечает Marouder

Здравствуйте, THE_PRO!
1) Во ПЕРВЫХ:
В твоем коде "or" - ЭТО ТАКАЯ БИТОВАЯ ОПЕРАЦИЯ - установка тех бит в одном числе, которые равны 1 в другом. Например, 1 or 2 = 3, 125 or 126 = 127, $FFF or $FFFFF = $FFFFF, а не проверка значений MonthN.
1 or 3 or 5 or 7 or 8 or 10 or 12 = 15, поэтому получается по сути у тебя в той строке:
if MonthN = 15 then begin dayN:=dayN+31; dec(m); end;
Надо писать:
if (MonthN=1) or (MonthN=3) or (MonthN=5) or (MonthN=7) or (MonthN=8) or (MonthN=12) then ......;
В ЭТОМ СЛУЧАЕ "or" означает уже совершенно другое и все будет нормально.
2) Во ВТОРЫХ:
Это, конечно, дело вкуса, но зачем ты пишешь так:
resultStr:='0'+IntToStr(d)+'.';
Ведь можно использовать функцию Format - лучше и проще использовать именно ее. Короче, это - признак професссионализма.
То же самое насчет dayN:=dayN+31, ведь гораздо проще Inc(DayN,31);
3) В ТРЕТЬИХ, для типа String вместо strlen есть функция length. Она делает то же самое, только не надо тип приводить - там аргумент имеет тип String.
4) В ЧЕТВЕРТЫХ. Почему, если ты не знаешь таких элементарных вещей, ты зарегистрировался экспертом? Не рано ли?.


Ответ отправлен: 30.09.2003, 11:06
Отправитель: Marouder


Отвечает ART_43

Доброе время суток, THE_PRO!
А может лучше так.
function SDCMain(yearB,yearN,monthB,monthN,dayB,dayN:Integer):String;
var y,m,d:Integer;
resultStr:string;
d1,d2:TDate;
begin
d1:=EncodeDate(yearB,monthB,dayB);
d2:=EncodeDate(yearN,monthN,dayN);
y:=YearsBetween(d1,d2);
if y>0 then
case CompareDate(d1,d2) of
-1: d1:=IncYear(d1,y);
1: d2:=IncYear(d2,y);
end;
m:=MonthsBetween(d1,d2);
if m>0 then
case CompareDate(d1,d2) of
-1: d1:=IncMonth(d1,m);
1: d2:=IncMonth(d2,m);
end;
d:=DaysBetween(d1,d2);
if y<10 then
resultStr:='0'+IntToStr(y)
else
resultStr:=IntToStr(y);
if m<10 then
resultStr:=resultStr+'.'+'0'+IntToStr(m)
else
resultStr:=resultStr+'.'+IntToStr(m);
if d<10 then
resultStr:=resultStr+'.'+'0'+IntToStr(d)
else
resultStr:=resultStr+'.'+IntToStr(d);
result:=resultStr;
end;


Ответ отправлен: 30.09.2003, 10:33
Отправитель: ART_43


Отвечает Boriss

Добрый день, THE_PRO!
Не мучайся:
В D7 в модуле DateUtils есть функция
function CompareDate(const A, B: TDateTime): TValueRelationship;
Она все сделает.
Иначе можно преобразовать опять же стандарнтыми функциями в число секунд,
вычесть и преобразовать обратно. Для этого ищи функции в SysUtils.


Ответ отправлен: 30.09.2003, 11:36
Отправитель: Boriss


Отвечает sir henry

Добрый день, THE_PRO!
Непонятно вообще, как эта функция может что-то делать :)
Смотри первый if, третий if.
Лучше опиши алгоритм чисто математически, формулами, без применения какого-либо языка программирования, тогда можно будет что-то сказать об алгоритме :).

Ответ отправлен: 30.09.2003, 10:26
Отправитель: sir henry


 Вопрос № 982

Здрасте эксперты. Дайте пожалста пример глобального клавиатурного хука на Delphi ну или док-цию. На мышу ставить получается глобальный, а на клаву... токо локальный почемуто....



Вопрос отправлен: 30.09.2003, 12:45
Отправитель: Inch (Inch@bratan.ru)

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

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

Добрый день, Inch!

На моей домашней странице лежит программа глобального клавиатурного хука. Дерзай!

Ответ отправлен: 30.09.2003, 14:37
Отправитель: Артём Шегеда


Отвечает Cybernetic Creature

Доброе время суток, Inch!
Hook - это механизм перехвата сообщений, путем установки специальной функции на верх стека hook-функций системы. Без установки таких ловушек практически невозможно обойтись при написании различных средств удаленного администрирования, шпионов и других программ в той или иной степени осуществляющих контроль за пользователем, использующем ОС Windows. Hook'и бывают глобальные (на всю систему) и локальные (на какой-либо поток).
Установить в систему hook можно при помощи функции SetWindowsHookEx(), со следующим заголовком:

HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId);
Если ты плохо воспринимаешь Си-шный код, на Delphi заголовок выглядит так:

SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc;
hmod: HINST; dwThreadId: DWORD): HHOOK;
Функция SetWindowsHookEx() в случае установки hook'a возвращает его дескриптор, в случае ошибки возвращает 0.
Разберем подробней все входящие параметры этой функции:
1. idHook - константа, определяет типа устанавливаемого hook'а. Может принимать одно из ниже перечисленных значений:

WH_CALLWNDPROC - Следит за сообщениями до отправки в оконную функцию и вызывается, когда процедуре окна посылается сообщение. Ловушка срабатывает при каждом вызове функции SendMessage.
WH_CALLWNDPROCRET - Контролирует сообщения после их отправки в оконную функцию.
WH_CBT - Вызывается перед обработкой большинства сообщений окон, мыши и клавиатуры (созданием окон, активация окон, уничтожением окон, сменой размера окон, перед установкой фокуса и.т.п.)
WH_DEBUG - Вызывается перед любой другой ловушкой. Полезно для отладки hook'ов.
WH_GETMESSAGE - Вызывается, когда из очереди приложения считывается сообщение.
WH_HARDWARE - Вызывается, когда из очереди приложения считывается сообщение установленного на компьютере оборудования.
WH_JOURNALPLAYBACK - Вызывается, когда из очереди системы считывается сообщение. Применяется для добавления в очередь системных событий.
WH_JOURNALRECORD - Вызывается, когда из очереди системы запрашивается какое-нибудь событие. Применяется для регистрации системных событий.
WH_KEYBOARD - Вызывается, когда из очереди приложения считывается сообщения WM_Keydown или WM_Keyup. Одна из самых распространенных ловушек -).
WH_MOUSE - Вызывается, когда из очереди приложения считывается сообщение мыши.
WH_MSGFILTER - Вызывается, когда сообщение должно быть обработано диалоговым окном приложения, меню или окном приложения.
WH_SHELL - Вызывается, когда создаются и разрушаются окна верхнего уровня или когда приложению-оболочке требуется стать активным.
2. lpfn - указатель на саму hook функцию. Ее заголовок:

function HOOKFUNCTION(code: Integer; wparam: WPARAM;
lparam: LPARAM): LRESULT stdcall;
Значения входящих параметров зависят от типа hook'a. Если ставится глобальный hook, эта функция должна обязательно находиться в dll.
3. hmod - принимает значение hInstance или дескриптор DLL (в глобальных ловушках).
4. dwThreadId - идентифицирует поток, в который вставляется ловушка. В глобальных hook'ах этот параметр должен быть равен 0.
Для удаления установленной ловушки существует функция UnhookWindowsHookEx(). В качестве параметра нужно использовать указатель (дескриптор) на hook функцию (значение, которое возвращает функция SetWindowsHookEx()).
Ну вот и все, с основами мы ознакомлены. Теперь напишем маленькую шуточную программу, ставящую hook на считывания сообщений мыши (WH_MOUSE). Сделаем так, чтобы при нажатии на правую кнопку мыши скрывалась кнопка "Пуск", при нажатии на левую - появлялась, среднею - изменялся заголовок активного окна. Сама hook функция будет находиться в dll. Кроме того, в dll будут находиться две процедуры - sethook() и removehook(), соответственно устанавливающие и удаляющие ловушку.
Привожу код dll библиотеки:

library lib;
uses
windows,messages;
var
H : THandle;
{Hook-функция}
function hook(c0de, wParam, lParam : integer): Lresult; stdcall;
{Объявления переменных}
var
w : THandle;
hw : hwnd;
begin
{Если c0de не меньше 0, все в порядке, продолжаем}
if c0de >= 0 then
begin
{ Если wParam = WM_RBUTTONUP, т.е. нажата правая кнопка мыши, получаем
хендл (handle) кнопки "Пуск" и скрываем ее }
case wParam of
WM_RBUTTONUP :
begin
W:= FindWindow('Shell_TrayWnd', nil);
W:= FindWindowEx(W, HWND(0),'Button', nil);
ShowWindow(W, SW_hide);
end;
{ Если wParam = WM_LBUTTONUP, т.е. нажата левая кнопка мыши, получаем
хендл кнопки пуск и показываем ее }
WM_LBUTTONUP:
begin
W:= FindWindow('Shell_TrayWnd', nil);
W:= FindWindowEx(W, HWND(0),'Button', nil);
ShowWindow(W, SW_SHOW);
end;
{ Если wParam = WM_MBUTTONUP, т.е. нажата средняя кнопка мыши, получаем
указатель на заголовок активного окна и изменяем его }
WM_MBUTTONUP:
begin
hw:=GetForegroundWindow;
SetWindowText(hw,'EXAMPLE OF WINDOWS HOOK (WH_MOUSE) - by Dark Lord
');
end;
end;
end else
{Если c0de меньше 0}
begin
{Вызываем следующую ловушку в цепочке ловушек Windows и выходим из процедуры}
result := CallNextHookEx(H, c0de, wParam, lParam);
exit;
end;
{Вызываем следующую ловушку в цепочке ловушек Windows}
result := CallNextHookEx(H, c0de, wParam, lParam);
End;

{ Процедура установки ловушки, если не удалось
установить - выводим сообщение об ошибке }
procedure sethook;
begin
H:= SetWindowsHookEx(WH_MOUSE, @hook, hInstance, 0);
if H = 0 then
messagebox(0,'hmmm..','ERROR',mb_iconhand);
end;
{ Процедура удаления ловушки }
procedure removehook;
begin
UnhookWindowsHookEx(H);
end;
{ Экспорт процедур установки и удаления hook'a }
exports
sethook index 1 name 'sethook',
removehook index 2 name 'removehook';
end.



В самой программе ловушка будет устанавливаться вызовом из dll процедуры sethook, удаляться - вызовом процедуры removehook. Пример установки и удаления hook'а и исходник dll библиотеки есть в прилагающемся исходнике. В данной статье были рассмотрены только основы установки ловушек. Есть немалое количество нюансов и возникающих проблем при установке нескольких hook'ов, установки hook'ов в разных ОС (особенно это касается глобальных ловушек). Для получения подробностей по этим вопросам рекомендую использовать Win32 API Reference или MSDN (если нет диска с MSDN - прогуляйтесь на http://msdn.microsoft.com, здесь правда не вся информация, но большая ее часть).


Ответ отправлен: 30.09.2003, 22:33
Отправитель: Cybernetic Creature


 Вопрос № 983

Здорова, коллеги!

Есть вопрос. Как в стандартном TPopupMenu сделать так, чтобы оно не скрывалось при выборе элемента. Это необходимо для того, чтобы при выборе элементов с Checked=true сразу было видно, что пометка снялась, кроме того, при большом количестве таких элементов неудобно каждый раз открывать меню правой кнопкой мыши.

Надеюсь, что эксперты у нас сильные...



Вопрос отправлен: 30.09.2003, 14:55
Отправитель: Артём Шегеда

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

Отвечает sir henry

Доброе время суток, Артём Шегеда!
Может быть вместо TPopupMenu удобнее будет использовать TCheckListBox или TRadioButton?

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


Отвечает Cybernetic Creature

Добрый день, Артём Шегеда!
Можно воспользоватся ChekListBox-ом. Ну если нажата правая кнопка мыши на елементе Лист показывается и вы делаете что хотите. А Попуп меню я два часа юзал ничего годного не нашел.

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


Отвечает _vt

Доброе время суток, Артём Шегеда!
1 способ: вообще вместо popupmenu вызывать диалог со всеми этими чекбоксами - ведь так обычно и делается в подобных случаях, а использовать для этого popup - думаю, это неправильно...
2 способ: после того как оно (popupmenu) скрылось, вызвать его еще раз программно...

*** E-Man - we are waiting for you ***


Ответ отправлен: 30.09.2003, 16:33
Отправитель: _vt



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

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

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

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

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

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




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


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

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

В избранное