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

Delphi - проблемы и решения

  Все выпуски  

Проблемы и решения в Delphi #27


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Проблемы и решения в Delphi - выпуск 28 от 6.09.2001.


Думай, решай и предлагай
коли не можешь, то не мешай.


ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС


Доброго Вам времени суток уважаемый читатель.

Продолжаю принимать Ваши предложения по организации OFFLine
архива исходников и процедур. Кстати, очень мало толковых
предложений по организации(структуре) архива.

Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Очередные вопросы.
2. Отвеченные вопросы.
~~~~~~~~~~~~~~~~~~~



1. Очередные вопросы.
---------------------


Вопрос 438:

От: Dima

Help, please! При попытке выполнения следующего запроса:
"update T1 set C1=NULL where Key1 IN
(select Key1 from T2 where C2=10)" на двух машинах из трех BDE выдает
сообщение "Data structure corruption". Delphi 4, BDE 5.0... База Paradox
7.


Ответить.

Ответ 1:


Вопрос 439:

От: Alexander Prishchepa

Доброго всем времени суток. У меня один вопрос, даже не совсем по
Delphi, а
скорее по Windows. Суть в следующем, я написал 2 разные программы, в
которых
используются ловушки на клавиатуру. И вот когда запускаешь их вместе, то
работает только 2-я программа. Это глюк форточек, или мой. И если можно,
то
подскажите как этого можно избежать. Можно ли устраивать многоуровневые
ловушки от разных программ, не связанных между собой так, чтобы они не
мешали друг другу.


Ответить.

Ответ 1:


Вопрос 440:

От: Чижов Александр


После установки репликации сведением на MS SQL2000 из приложений
дельфи выполняются только Select запросы. Запросы модификации и удаления
вызывают ошибку General SQL Error. ODBC SQL server driver. invalid
character value for cast specification.



Ответить.

Ответ 1:


Вопрос 441:

От: Ivan

Добрый день. Помогите пожалуйста, а то я уже опух...
Как мне проделать такую штуку: есть элемент в windows(окно у которого я
не
знаю handle, например), я изменяю в нем что-нибудь(текст, например), всё
это
происходит OnTimer( в котором, в свою очередь, есть цикл( НЕ
непрерывный, в
нём перебираются все хэндлы винды и находится нужный, по классу):
for i:=1 to 4069 //здесь перебираются хэндлы
for j:=0 to 30). Тут окошко возьмёт да и подмигнет, какое плохое
окошко! Я
чего только с ним не делал:
SendMessage(i,wm_setfont,GetStockObject(DEFAULT_GUI_FONT),1);
SetWindowText(i,buf);

SetWindowPos(i,HWND_TOP,0,0,rect.Right-rect.Left,rect.Bottom-rect.Top,SW
P_NO
MOVE);
RedrawWindow(i,0,0,RDW_UPDATENOW);
Все это я или комбинировал или использовал по- отдельности.
Может ещё есть какие комбинации Api- фунуций... Но надо опять же с
перерисовочным флагом.
Кстати, когда я использовал непрерывный цикл:
for i:=1 to 4069
for j:=0 to 30, в конце которого происходил переход наверх( на for i:=1
to
4069),
то меня спасло вот что:
SendMessage(i,wm_setfont,GetStockObject(DEFAULT_GUI_FONT),1);
SetWindowText(i,buf);
goto lab1,
где lab1(метка) была вначале алгоритма и в ней тоже происходила
перерисовка.
Так вот: неужели такой непрерывный цикл медленнее чем OnTimer(0,5
секунд,
500 ms).
Или может действительно он не успевает пройти... Дело вот ещё в чём:
если
ставить OnTimer более 600 ms, то окно прерисовывается только через
некоторое
время, значит цикл быстрее 600 ms.
Я где- то( не помню) читал как избавиться от мигания при перерисовке
формы.
Но у окон винды нет canvas, или я неправ? Мне хотя бы это, я бы
состряпал
может чего.
Если кто знает, как избавиться от такого мигания, буду очень
признателен.


Ответить.

Ответ 1:


Вопрос 442:

От: Денис

Привет, у меня проблема необходимо добраться до Winampа, в смысле
сказать ему проиграй этот файл, это лист, уменьши громкость, перейди
на такую-то секунду и т.д. Как это сделать не представляю. Надо
позарез.

Ответить.

Ответ 1:


Вопрос 443:

От: Вертянкин Алексей

Как избежать активизации события
перерисовки формы OnPaint каким-нибудь красивым способом?

У меня на форме есть объекты-наследники класса TImage;
Есть методы, двигающие эти объекты на форме.
Во время движения такого объекта происходит полная перерисовка формы.
Но для оптимизации нужно перерисовать только часть канвы формы.
Методы движения моих объектов в своем теле используют унаследованную
от Timage перерисовку себя: (inherited repaint).
После такой перерисовки происходит событие Onpaint формы. Так вот
здесь мне и нужно это событие "подавить"
Можно конечно попробовать с глобальным флагом, но я чувствую должно
быть более рациональное решение.


Ответить.

Ответ 1:


Вопрос 444:

От: Prytkov@tut.by

На одной машине используется несколько приложений, работающих через
BDE с локальными БД (dbf, PDox). Если в один момент времени активно
только одно из них, все ОК. Но если они работают параллельно,
слетает либо приложение, либо система. Причем приложения
использует разные базы - каждое свою.


Ответить.

Ответ 1:


Вопрос 445:

От: Алексей Малиновский

Устанавливаю Interbase Server на сервер (невыделеный).
Запускаю ibserver.exe.
Запускаю мою программу - РАБОТАЕТ!
Устанавливаю Interbase Client на клиентскую машину.
Запускаю ibguard.exe.
Запускаю мою программу, и выбираю БД с серверной машины - ПРОГРАММА НЕ
РАБОТАЕТ (ошибка соединения с сервером)!

В чём может быть поблема???


Ответить.

Ответ 1:


Вопрос 446:

От: My Portal Inc.

Каким образом можно читать инфу из запущенного
exe-файла, или его скоприровать, как это делает
напр. FAR.

Операции через поток TFileStream не помогают,
в "лоб" тоже косяк..... Можа кто скажет как?


Ответить.

Ответ 1:


Вопрос 447:

От: banov

:
Подскажите, почему не работает!

Клиент:
procedure TForm1.OKClick(Sender: TObject);
var
thefile:TFilestream;
begin
thefile:=TFilestream.Create('Путь к файлу', fmOpenread);
ClientSocket1.Socket.SendStream(thefile);
thefile.Free;
t:=false;
end;

Сервер:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
e:integer;
buf:PChar;
thefile: file of Char;

begin
assignfile(thefile,'newfile.tmp');
rewrite(thefile);
e:=Socket.ReceiveLength;
GetMem(buf,e+1);
Socket.ReceiveBuf(buf^,e);
BlockWrite(thefile,buf^,e);
FreeMem(buf);
closefile(thefile);
end;


Ответить.

Ответ 1:


Вопрос 448:

От: Богер Евгений

Где достать описание всех функций WinAPI на русском языке?


Ответить.

Ответ 1:


Вопрос 449:

От: Богер Евгений

Подскажите где есть содержимое дискеты к книге "OpenGL графика в
проектах
DELPHI" автор М.Краснов ?


Ответить.

Ответ 1:



2. Отвеченные вопросы.
----------------------


Вопрос 332:

От: Eugene

:case of?

Каким образом перечислить в "сase" _не цифровые_ значения:


case Parameter2 of
"один": begin {} end;
"два" : begin {} end;
"остальной": begin {} end;
end;//of


Ответить.

Ответ 1:
Никаким!!! В case могут быть использованы только ordinal types, т.е. все
целые, все логические, перечисляемые типы и char.
Ответ 2:
А никак ((

ты скажи для чего это нужно??

можно, например, сделать TStringList, заполнить его
нужными значениями, а потом :

type
TSomeEnum = (seFirst, seSecond, ... );
...............
case SomeStringList.Items.IndexOf(S) of
seFirst: begin...end;
seSecond: begin...end;
......
end;
Ответ 3:
Можно сложить все буквы и получить контрольную сумму
слова например:

var w,i:word;
st:string;
st:= какое-то слово
w:=o;
For i:=1 to length(st) do
w:=w+ord(st[i]);

case w of
195: ... {'ab'}
199: ... {'cd'}
....
end;
Ответ 4:
type MyType = ('один','два','три','четыре');

var Parameter2:MyType;

case Parameter2 of
'один': begin {} end;
'два' : begin {} end;
else: begin {} end;
end;


Вопрос 333:

От: Алексей


Здравствуйте. При создании программы мне не хватило средств Оbject
Раscal, пришлось использовать API-функции. В моей книге написаны лишь их
названия. Подскажите, как использовать CopyFile и CreateFile. Cпасибо.


Ответить.

Ответ 1:
BOOL CopyFile(

LPCTSTR lpExistingFileName, // pointer to name of an existing file
LPCTSTR lpNewFileName, // pointer to filename to copy to
BOOL bFailIfExists // flag for operation if file exists
);



Вопрос 334:

От: fedorenkov

Господа, подскажите как быть :
работаю из Delphi с Oracle, часть программы хочу разместить в DLL
библиотеке,
но как из нее загружать формы и не тратить время на соединение с базой
данных
компонентом TDatabase не представляю . Может кто сталкивался с этим
вопросом ?


Ответить.

Ответ 1:
В DLL кидаеш на форму или DataModule компонент TDatabase.

Устанавливаеш следующие параметры:
AliasName - пустое
Connected - False
DatabaseName - какое хочеш для себя
LoginPrompt - False

Все запросы привязываются к Database в DLL.

Создаеш например

procedure InitDLL(DBHandle: HDBIDB); stdcall;
begin
...
Database.Handle := DBHandle;
...
end;

В основной программе загружаеш DLL вызываеш InitDLL,
а затем сколько угодно других процедур, которые создают формы.

Если только одна форма, так можно все объеденить.
Ну там уже как фантазия подскажет.

Вопрос 335:

От: Лобастов Николай

Я открываю файл с помощью FileOpen.
Создаю S: ANSIstring; (в Delphi V просто string)
Теперь мне эту строку надо загнать в этот файл с помощью FileWrite
Функция действует на низком уровне, ей все равно что ты пишешь.
Если я перевожу строку в ShortString, то вместе со строкой записывается
и первый байт. Если оставить в ANSIstring, то вообще абра-кадабра
получается.

Подскажите как писать строку в файл с помощью FileWrite.


Ответить.

Ответ 1:
FileWrite((Pointer(S)^, Length(S)); // все!!
Ответ 2:
начала определись зачем и вкакой форме тебе это нужно.
Строки ANSIString имеют разную длину. Если писать их в файл, то, в результате
получиться длиная строка - сумма всех записанных строк.
Этот пример будет работать и с ANSI и с SHORT строками:
FileWrite(Handle, s[1], Length(s));
Если надо получить текстовый файл разделяй строки строкой #13#10:
s := #13#10;
FileWrite(Handle, s[1], 2);
Ответ 3:
ANSIString по сути представляет собой PChar структуру - автоматически
выделяется память и значению ANSIString присваивается указатель на
выделенную область. Но c ANSIString легко работать посимвольно:
s1:ANSIString;
begin
SomeChar:=s1[CharIndex]
Далее - переписать строку в буфер (например
символьный массив) и этот буфер скинуть в файл...
А вообще, все строки представляют собой такие структуры. Только у
ShortString вместо указателя - счетчик символов, а блок данных
физически расположен вместе со счетчиком.


Вопрос 336:

От: КОПЫТИН Павел

Объясните, плз., как в Дельфях сделать липнущие к друг другу окна. Я
переписывал WMNCheetTest - но что то ни фига, когда я пытаюсь засунуть
тудакучу проверок - форма начинает моргать при рефреше.


Ответить.

Ответ 1:
Я вот тут для этого класс сделал. Впринцыпе работает нормально. Загрузить
можно с http://f-soft.km.ru/products/dockmanager.zip
пример использования: http://f-soft.km.ru/products/docksample.zip


Вопрос 337:

От: Vasya Naiv

Не подскажете ли как в Дельфи, имея DLL c СОМ -объектом и типизированной
библиотекой внутри, поднять этот объект и обратиться к какому-нибудь
методу одного из интерфейсов объекта.


Ответить.

Ответ 1:


Вопрос 338:

От: NikK

Я однажды предлагал задачу по сохранению пользовательского интерфейса,
но,
видать, дельфийское сообщество решило, что тут все уже решено.
Ну что же, тогда пусть мне умные люди подскажут, как решить мою задачу.
Чтобы было проще, скажу, что речь идет о сохранении формы
в файле через поток, причем на форме есть объекты (в данном примере это
обработчик кнопки), которым обрабочики событий назначаются динамически.
Вот как раз в этих обработчиках и проблема.

Вот модули моей задачи.
======================

Формочка хранится в файле TestEverything.dfm
//===================================================
<file://===================================================>
object Form1: TForm1
Left = 193
Top = 107
Width = 484
Height = 146
Caption = 'Полигон'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.style="[]"
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 176
Top = 67
Width = 32
Height = 13
Caption = 'Label1'
end
object Label2: TLabel
Left = 176
Top = 95
Width = 32
Height = 13
Caption = 'Label2'
end
object Button1: TButton
Left = 4
Top = 5
Width = 161
Height = 25
Caption = 'Сохранить форму в файле'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 4
Top = 33
Width = 161
Height = 25
Caption = 'Загрузить форму из файла'
TabOrder = 1
OnClick = Button2Click
end
object Button3: TButton
Left = 4
Top = 61
Width = 161
Height = 25
Caption = 'Контрольный обработчик'
TabOrder = 2
OnClick = Button3Click
end
object Button4: TButton
Left = 4
Top = 89
Width = 161
Height = 25
Caption = 'Динамический обработчик'
TabOrder = 3
end
object Button5: TButton
Left = 232
Top = 5
Width = 241
Height = 25
Caption = 'Убрать надписи на TLabel-х'
TabOrder = 4
OnClick = Button5Click
end
end

Модуль этой формочки
//============================== <file://==============================>

unit TestEverything;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Label1: TLabel;
Label2: TLabel;
Button5: TButton;
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses TestUnit;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption := 'Меня создали';
Label2.Caption := 'И меня создали';
Button4.OnClick := FbEvent.TestBtnClick;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Label1.Caption := 'Со мной что-то сделали';
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
Label1.Caption := 'Меня зачистили';
Label2.Caption := 'И меня зачистили';
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
wFileSream : TFileStream;
wFileName : String;
begin { Сохранение формы в файле }
wFileName := Self.ClassName + '.XXX';
wFileSream := TFileStream.Create(wFileName, fmOpenWrite or fmCreate);
try
wFileSream.WriteComponent(Form1);
finally
wFileSream.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
wFileSream : TFileStream;
wFileName : String;
k : Integer;
begin { Загрузка формы из файла с расширением FOB }
wFileName := Self.ClassName + '.XXX';
wFileSream := TFileStream.Create(wFileName, fmOpenRead);
try
for k:=Form1.ComponentCount-1 downto 0 do
TComponent(Form1.Components[k]).Free;
Application.RemoveComponent(Form1);
wFileSream.ReadComponent(Form1);
Application.InsertComponent(Form1);
Form1.Caption := 'Форма из файла';
finally
wFileSream.Free;
end;
end;

end.

Небольшое пояснение к проблеме:
1. Запускаем задачу, жмем кнопки "Контрольный обработчик",
затем "Динамический обработчик" и видим, что они работают,
т.е. пишут на Label1 и Label2 свои надписи. Кнопкой "Убрать надписи на
TLabel-х"
очищаем их для удобства наблюдения действий.

2. Жмем кнопку "Сохранить форму в файле" и сохраняем форму в файле
через TFileStream. Все отлично. При этом запомним состояние надписей для
пущей убедительности.

3. Выключаемся. Снова запускаемся. Видим первозданную форму.

4. Жмем кнопку "Загрузить форму из файла".
На исключение, которое при этом возникает, поплевываем и видим,
что вернулась сохраненная форма.
Великолепно.

5. Жмем кнопку "Убрать надписи на TLabel-х". Все отлично.

6. Жмем "Контрольный обработчик". Отлично.

7. Жмем "Динамический обработчик". И тут нас ждет ФИАСКО!!!
Так куда же девался обработчик, и как его поставить на место?
Подскажите, буду благодарен дельфийскому сообществу.

Вот модуль, откуда этот самый динамический обработчик первоначально
был подцеплен к кнопке "Динамический обработчик".
Причем объект TFbEvent, из которого был взят обработчик,
никогда не создается, т.к. методы классов, как хорошо известно,
загружаются в память без создания экземпляров классов.
//============================== <file://==============================>

unit TestUnit;

interface
Uses
Windows, SysUtils, Dialogs, Graphics, StdCtrls, Forms, Classes;

Type
{ КОНТЕЙНЕР ОБРАБОТЧИКОВ СОБЫТИЙ }
TFbEvent = class(TComponent)
private
protected
public
Constructor Create(AOwner : TComponent); Override;
procedure TestBtnClick(Sender: TObject);
end;

Var
FbEvent : TFbEvent;
implementation

{ TFbEvent }

constructor TFbEvent.Create(AOwner: TComponent);
begin
inherited;

end;

procedure TFbEvent.TestBtnClick(Sender: TObject);
Var
wComp : TComponent;
begin { Динамический обработчик }
if Sender is TComponent then
wComp := TComponent(Sender).Owner;

if wComp.FindComponent('Label2') <> nil then
if wComp.FindComponent('Label2') is TLabel then
TLabel(wComp.FindComponent('Label2')).Caption :=
'Вот так меня достали из динамического обработчика';
end;

end.

Все это мне нужно для задачи, о которой можно прочитать
на http://www.mtu-net.ru/fobos/ <http://www.mtu-net.ru/fobos/>


Ответить.

Ответ 1:
Вам поможет использование RTTI (Runtime Type Information).

У корня иерархии объектов TObject имеются методы MethodAddress и
MethodName. Если Вы проработаете их исходники (модуль System.pas), то
вопросов не останется. Небесполезным будет изучение Forms.pas, ведь
Ваша проблема уже решена разработчиками Delphi. Вспомните, каково
назначение файлов *.dfm и ключевого слова published и как это
позволяет во время работы с формой в среде менять динамически
обработчики событий.

Вопрос 339:

От: NEN

Есть классный компонент к дельфям Async 3 Pro. от TurboPower
Помогите зарегистрировать, мож у кого кряк есть. :)))))


Ответить.

Ответ 1:


Вопрос 340:

От: Андрей Сергеевич

Как в DBGrid изменить высоту строки, не столбца, а именно строки (не
изменяя шрифт), и еще, вы не подскажите как осуществлять ногострочность
в одной строке (переностить строку), как в Excel или Word.


Ответить.

Ответ 1:


Вопрос 341:

От: КОПЫТИН Павел

Подскажите, пожалуйста, как нормально защитить свои проги от
копирования (хотя бы от ламеров).
Наша программа продается на сидюках, ну вот как сделать, что бы с них не
делали копии простые смертные?


Ответить.

Ответ 1:
возьми пару кластеров на CD которые не поменяются после изменений в
программе (какой нить сурс) и определяй их физической значение.
то есть: есть на диске autorun.inf, каталог sеtup, узнаем, где находятся
их первые кластеры и в проге читаем эти кластеры низким уровнем
(должно помочь против cdfake'ров), при этом лучше один раз узнать этот
адрес, а потом только его и читать, без нового определения адреса.

а против копирования помогает такой
прием в конце файла с размером не кратным объему кластера, чтобы в
последнем кластере оставалось место, писаем при заливке туда чёнить, а
потом читаем.
Ответ 2:
Смотря на каком этапе твоя супер-пупер прога должна показывать нос.
Защитить от простого копирования, очень трудно, порой, на сколько я
знаю используется физический процес защиты. А так самый простой и
опять же как ты говоришь для ламеров, эта ввести систему регистрации
пользователя. Что то типа Unlock кодов, вычисляемых по какой нибуть
замысловатой формуле. Поинтереснее вариант, кагда прога
взаимодействует с какой то железкой, и при регистрации шлет репорт
тебе (естественно зашифрованый), а ты сам подбыраешь анлок код. Тогда
твою прогу, даже, если кто нибуть узнаеп пароль, можно будет юзать
только на 1 компе, всякие там куйгены с такой прогой не прокатывают.
А вообще защиты своих прог (правдо было бы сначало что защищать :)
нужно писать самому, многие универсальные методы уже давно сломаны и
это будет просто не стильно.

Вопрос 342:

От: Олег Супроненко

Ищу компонент или библиотеку для работы с dbf таблицами такую, чтобы
можно было организовывать контекстный поиск по ключу.
Очень нужно!!
Подскажите плз что имеется для таких целей, и где его можно найти.

Ответить.

Ответ 1:


Вопрос 343:

От: Anton

Я пишу программу по удаленному администрированию...
Тема интернета в Delphi для меня тёмный лес.
Столкнулся с такой проблемой:
допустим в edit'e стоит IP, как мне перезагрузить удалённый
компьютер или выключить его.
Помню,что существует длиннющая функция для перезагрузки компьютера в
локальной сети через определённый промежуток времени.
Программисты, подскажите пожалуйста как ЭТО сделать?


Ответить.

Ответ 1:
нужно юзать WINAPI функцию InitiateSystemShutdown.
Пример использования - ниже.
Работает исключительно с системами типа NT/2000. Системы 9х напрочь отказываются выключаться даже если их
выключать с контроллера домена (по крайней мере у меня так и не получилось)


procedure TForm1.Button1Click(Sender: TObject);
var
lpMachineName: PChar;
lpMessage : PChar;
dwTimeOut : DWORD;
bForceAppsClosed : BOOL;
bRebootAfterShutdown : BOOL;

begin
lpMachineName := PChar(Edit1.Text);// имя машины в сети (не IP адрес)
lpMessage := PChar('You are fired!');// сообщение удивленному юзеру
dwTimeOut := 0 // таймаут
bForceAppsClosed := True; // закрывать ли открытые приложения принудительно
bRebootAfterShutdown :=True; // перезагружаться ли после выключения

InitiateSystemShutdown(lpMachineName, lpMessage, dwTimeout, bForceAppsClosed, bRebootAfterShutdown);




end;


Вопрос 344:

От: Нестеренко Кирилл


Работаю с RadioBox. Скажем 3 этих бокса на форме, запускаю прогу,
выбираю 2 бокс.
Где хранятся даные о том какой из трех RadioBox-ов выбран?
А для CheckBox-ов?
Или нужно через проверку св-ва Checked каждого бокса, но что-то мне не
вериться.

Ответить.

Ответ 1:
:Не лучшее решение, но универсальное:
var
index :integer;
begin
for index :=0 to ComponentCount -1 do
if Components[index] is TRadioButton then
if TRadionButtom(Components[index]).Checked then
ShowMessage('Мы нашли его! :) ');


Вопрос 345:

От: Гавриленко Степан

Я например захотел программно сменить картинку на рабочем столе. Обои
т.е... я залез в реестр изменил нужную строку. Все нормально. в
реестре изменилось. Но сам виндовс не обновился. Т.е картинка не
сменилась. Потом, когда я запускаю какуюнить игру, она меняется. А так
нет. Как мне обновить виндовс? перерисовать чтоли.


Ответить.

Ответ 1:
Вот так:
procedure TForm1.FormCreate(Sender: TObject);
var
St : string;
begin
St := 'C:\MyWallPaper.Bmp';
SystemParametersInfo(SPI_SETDESKWALLPAPER,UINT(St),nil,SPIF_SENDCHANGE);
end;
Ответ 2:
Попробуй покапаться с АПИ - SystemParametersInfo



или вот тебе компонент:

unit Walpaper;

interface

uses
{$IFDEF WIN32} Windows, Registry, {$ELSE} WinTypes, WinProcs, IniFiles, {$ENDIF}
Classes, Controls, SysUtils;

type
TWallPaper = class(TComponent)
private
PC: Array[0..$FF] of Char;
{$IFDEF WIN32}
Reg: TRegistry;
{$ELSE}
Reg: TIniFile;
WinIniPath: String;
{$ENDIF}

function GetWallpaper: String;
procedure SetWallpaper(Value: String);
function GetTile: Boolean;
procedure SetTile(Value: Boolean);
function GetStretch: Boolean;
procedure SetStretch(Value: Boolean);
protected
{$IFNDEF WIN32}
constructor Create(aOwner: TComponent); override;
{$ENDIF}
public
published
property Wallpaper: String read GetWallpaper write SetWallpaper;
property Tile: Boolean read GetTile write SetTile;
property Stretch: Boolean read GetStretch write SetStretch;
end;

procedure Register;

implementation

{$IFNDEF WIN32}
constructor TWallpaper.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
GetWindowsDirectory(PC, $FF);
WinIniPath := StrPas(PC) + '\WIN.INI';
end;
{$ENDIF}

function TWallpaper.GetWallpaper: String;
begin
{$IFDEF WIN32}
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('\Control Panel\desktop\', False);
Result := Reg.ReadString('Wallpaper');
Reg.Free;
{$ELSE}
Reg := TIniFile.Create(WinIniPath);
Result := Reg.ReadString('Desktop', 'Wallpaper', '');
Reg.Free;
{$ENDIF}
end;

procedure TWallpaper.SetWallpaper(Value: String);
begin
if not (csDesigning in ComponentState) and
not (csLoading in ComponentState) and
not (csReading in ComponentState) then
begin
StrPCopy(PC, Value);
SystemParametersInfo(spi_SetDeskWallpaper, 0, @PC, spif_UpdateIniFile);
end;
end;

function TWallpaper.GetTile: Boolean;
begin
{$IFDEF WIN32}
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('\Control Panel\desktop\', False);
Result := Boolean(StrToInt(Reg.ReadString('TileWallpaper')));
Reg.Free;
{$ELSE}
Reg := TIniFile.Create(WinIniPath);
Result := Reg.ReadBool('Desktop', 'TileWallpaper', False);
Reg.Free;
{$ENDIF}
end;

procedure TWallpaper.SetTile(Value: Boolean);
begin
if not (csDesigning in ComponentState) and
not (csLoading in ComponentState) and
not (csReading in ComponentState) then
begin
{$IFDEF WIN32}
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('\Control Panel\desktop\', False);
Reg.WriteString('TileWallpaper', IntToStr(Integer(Value)));
Reg.Free;
{$ELSE}
Reg := TIniFile.Create(WinIniPath);
Reg.WriteBool('Desktop', 'TileWallpaper', Value);
Reg.Free;
{$ENDIF}
SetWallpaper(Wallpaper);
end;
end;

function TWallpaper.GetStretch: Boolean;
var
i: Integer;
begin
{$IFDEF WIN32}
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('\Control Panel\desktop\', False);
i := StrToInt(Reg.ReadString('WallpaperStyle'));
except
end;
Reg.Free;
{$ELSE}
Reg := TIniFile.Create(WinIniPath);
i := Reg.ReadInteger('Desktop', 'WallpaperStyle', 0);
Reg.Free;
{$ENDIF}
Result := i = 2;
end;

procedure TWallpaper.SetStretch(Value: Boolean);
var
v: Integer;
begin
if not (csDesigning in ComponentState) and
not (csLoading in ComponentState) and
not (csReading in ComponentState) then
begin
if Value then v := 2 else v := 0;

{$IFDEF WIN32}
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CURRENT_USER;
Reg.OpenKey('\Control Panel\desktop\', False);
Reg.WriteString('WallpaperStyle', IntToStr(v));
Reg.Free;
{$ELSE}
Reg := TIniFile.Create(WinIniPath);
Reg.WriteInteger('Desktop', 'WallpaperStyle', v);
Reg.Free;
{$ENDIF}
SetWallpaper(Wallpaper);
end;
end;

procedure Register;
begin
RegisterComponents('JohnUtil', [TWallPaper]);
end;

end.
Ответ 3:
WinAPI:
BOOL SystemParametersInfo(
UINT uiAction, // system parameter to query or set
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // user profile update flag
);

uiAction := SPI_SETDESKWALLPAPER Sets the desktop wallpaper.
pvParam := 'Имя BMP файла'#0
uiParam := 0
fWinIni := SPIF_UPDATEINIFILE
Ответ 4:
Программка смены обоев на рабочем столе.
Имя файла с картинкой передается через параметр.

Текст файла change.dpr:

{-- change.dpr --}
program change;
uses
windows;
var
s: string;
begin
s := paramStr(1);
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, @S[1],
SPIF_UPDATEINIFILE OR SPIF_SENDWININICHANGE);
end.
{-- end of change.dpr --}

Запускаешь:
change.exe "имя файла с картинкой"


Вопрос 346:

От: Нестеренко Кирилл


:Здоровенькi були!
Хлопцi, копался в кое каком материальчике и вот вопрос:
1. Каким образом и при каких обстаятельствах можно использовать DDE
приложения?
2. DDE-сервер и DDE-клиент это две разные программы на моем компьютере?


Ответить.

Ответ 1:


Вопрос 347:

От: anton

Пришлите,если у кого есть,исходник видео-проигрывателя.Ещё пришлите,если
у кого есть,crack для сборника компонентов MMTool5.Скажите,можно ли делать
crack на Delphi5,в смысле делать небольшую какую-нибудь
программку,которая
будет убирать регистрацию с другой программы.


Ответить.

Ответ 1:
1. Легче всего видеоплеер делать с помощью MCI
(TMediaPlayer) из Delphi 2/3/4/5.
2. Чтобы найти ломалку для любой программы, лучше всего
юзать http://astalavista.box.sk.
3. Кряк можно писать на любом языке (мое личное мнение).
Например, на Делфи можно легко менять hex-содержимое файла.
Но лучше всего использовать patch/diff.


Вопрос 348:

От: Антон

При составлении запроса с использованием плана возникает ошибка :

index (RDB$PRIMARY240) cannot be used in the specified plan

Удалось установить, что все остальные индексы в таблице Rdb$indices
все PRIMARY индексы имеют значение в поле Rdb$index_id=1, а
индекс RDB$PRIMARY240 равное 2. Что означает это поле, и вследствии
чего изменяются его значения.


Ответить.

Ответ 1:


Вопрос 349:

От: LYNX

В Дельфи 5, когда создаёшь 1 форму (Form1), а потом вторую форму (Form2)
и писание действия из Form1: Form2.Show или что-нибудь связанное с Form2
то Form2 неопознаётся. В чём дело? В 4 Дельфи такого не было. Мож надо
что-то дописать ?


Ответить.

Ответ 1:
Заюзай в Form1(Unit1) модуль где находится Form2(Unit2). Клавиша Alt + F11.
Либо же в дерективе uses которая находится в разделе реализации сам пропиши.


Вопрос 350:

От: Shaman

Господа, кто-нибудь знает, где можно достать доки, где Internet
Explorer описан как СОМ объект. В общем, мне нужно написать клиент
автоматизации для IE.


Ответить.

Ответ 1:
В MSDN, ищи WebBrowser Object.










Если Вы хотите как можно скорее получить ответ на свой вопрос, то
укажите в теме письма - delphiV,иначе письмо будет прочитано значительно
позже, если же у вас есть предложения то в теме письма укажите delphiP.

Для интересующихся - немного о себе. Работаю на
железнодорожном транспорте ведущим программистом.
Основные мои разработки это сбор и доставка клиентам
информации о вагонах и поездах: где находится(по России),
куда едет. В связи с этим программировал для e-mail,Socket,БД,ISAPI.

За сим прощаюсь - скорых Вам и качественных программ.

Автор рассылки - Дмитрий.
ICQ - 89533941.

ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС



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

В избранное