Ответы на ваши вопросы |
ЗАДАТЬ ВОПРОС    HOME  MAIL |
Как сделать перетаскивание окна, если у него нет заголовка, не используя WM_NCHITTEST?Можно воспользоваться стандартными событиями и сделать все вручную. var
po: TPoint;
moving: boolean = false;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
p: TPoint;
begin
if moving then begin
p := Form1.ClientToScreen(Point(X, Y));
Form1.SetBounds(p.x - po.x, p.y - po.y, Form1.Width, Form1.Height);
end;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Y <= 50 then begin
po := Point(X, Y);
moving := true;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.BorderStyle := bsNone;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
moving := false;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
with Form1.Canvas do begin
Brush.Color := clNavy;
FillRect(Bounds(0, 0, FOrm1.Width, 50));
end;
end;
Как считать из файла список слов и отсортировать их, не потеряв при этом номер каждого слова в файле?Можно воспользоваться StringList, который уже умеет сортировать, а номера записывать в объекты. procedure TForm1.Button1Click(Sender: TObject);
var
F: TextFile;
st: string;
s: TStringList;
i: integer;
begin
AssignFile(F, ExtractFilePath(Application.ExeName) + 'names.txt');
Reset(F);
s := TStringList.Create;
i := 0;
while not EOF(F) do begin
inc(i);
readln(F, st);
s.AddObject(st, TObject(i));
end;
CloseFile(F);
s.Sort;
for i := 0 to s.Count - 1 do
s.Strings[i] := s.Strings[i] + #32 + IntToStr(integer(s.Objects[i]));
ListBox1.Items := s;
end;
Как по тексту сгенерировать ключ, чтобы при следующем запуске программы проверить по этому ключу, изменился ли текст?Можно посчитать контрольную сумму (сумму всех символов в Memo), сохранить ее. При следующем запуске опять рассчитать контрольную сумму и сравнить с сохраненной. В этой программе контрольную сумма сохраняется в MyIni.ini. А текст – в text.txt. procedure TForm1.FormCreate(Sender: TObject);
var
ini: TIniFile;
sum, sum1: longint;
i: integer;
begin
if FileExists(ExtractFilePath(ParamStr(0)) +
'text.txt') = false then Exit;
Memo1.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) +
'text.txt');
ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) +
'MyIni.ini');
sum := ini.ReadInteger('file', 'sum', -1);
if sum >= 0 then begin
sum1 := 0;
for i := 1 to Length(Memo1.Text) do
inc(sum1, ord(Memo1.Text[i]));
if sum <> sum1 then ShowMessage('Изменился!');
end;
ini.Destroy;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
ini: TIniFile;
sum: longint;
i: integer;
begin
Memo1.Lines.SaveToFile(ExtractFilePath(ParamStr(0)) +
'text.txt');
ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) +
'MyIni.ini');
sum := 0;
for i := 1 to Length(Memo1.Text) do
inc(sum, ord(Memo1.Text[i]));
ini.WriteInteger('file', 'sum', sum);
ini.Destroy;
end;
Как рисовать на кнопке "Пуск"?Насколько я знаю, кнопку "Пуск" переименовать насовсем нельзя, можно только на ней нарисовать что-то. Но, как только она перерисуется (например, пользователь нажмет на нее), Ваш рисунок исчезнет. procedure TForm1.Button1Click(Sender: TObject);
var
h: THandle;
can: TCanvas;
begin
h := FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0,
'Button', nil);
can := TCanvas.Create;
can.Handle := GetDC(h);
can.Brush.Color := clSilver;
can.FillRect(Rect(2, 2, can.ClipRect.Right - 2, can.ClipRect.Bottom - 2));
can.TextOut(2, 2, 'delphi4all');
ReleaseDC(h, can.Handle);
can.Destroy;
end;
Как обьединить несколько компонентов?В Delphi есть полезная функция - FindComponent. Она возвращает компонент с заданным именем. Поэтому можно в цикле изменить какое-то свойство сразу многих компонентов. Эта программа убирает с экрана поля ввода.
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 1 to 5 do
(FindComponent('Edit' + IntToStr(i)) as TEdit).Visible := false;
end;
Как полностью очистить TreeView?В ListView за все данные отвечает свойство Items. procedure TForm1.Button1Click(Sender: TObject); begin ListView1.Items.Clear; end;
Как из строки считывать слова, разделенные запятойЗдесь приведены два алгоритма. Первый удобен, если входные данные - переменная, которую можно менять и она больше не понадобится. Второй вариант не изменяет входных данных. procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
p: integer;
begin
s := 'саша,маша,оля';
repeat
p := pos(',', s);
if p <= 0 then p := Length(s) + 1;
ListBox1.Items.Add(copy(s, 1, p - 1));
delete(s, 1, p);
until s = '';
end;
procedure TForm1.Button2Click(Sender: TObject);
const
s = 'саша,маша,оля';
var
i: integer;
buf: string;
begin
buf := '';
for i := 1 to Length(s) do
if s[i] = ',' then begin
ListBox1.Items.Add(buf);
buf := '';
end else buf := buf + s[i];
ListBox1.Items.Add(buf);
end;
Как в ini-файле переименовать секцию?Насколько я знаю, процедуры, переименовывающей секцию, нет. Можно, разве что, открыть ini-файл как текстовый, и изменить непосредственно в нем название секции. Но если высокая скорость не очень нужно, то можно воспользоваться более простым методом: скопировать все значения из старой секции в новую, а затем удалить старую. В этом примере Button2 заполняет секцию first файла data.ini, а Button1 переименовывает эту секцию в second. uses IniFiles;
procedure TForm1.Button1Click(Sender: TObject);
var
ini: TIniFile;
names: TStringList;
i: integer;
begin
ini := TIniFile.Create('data.ini');
names := TStringList.Create;
ini.ReadSection('first', names);
for i := 0 to names.Count - 1 do
ini.WriteString('second', names.Strings[i],
ini.ReadString('first', names.Strings[i], ''));
names.Destroy;
ini.EraseSection('first');
ini.Destroy;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
ini: TIniFile;
begin
ini := TIniFile.Create('data.ini');
ini.WriteString('first', 'x', '456');
ini.WriteString('first', 'y', '123');
ini.WriteString('first', 'name', 'Daniel');
ini.Destroy;
end;
Как зашифровать текстЭтот алгоритм прибавляет к номеру каждого символа текста номер очередного символа повторяющегося пароля. Например: "какой-то текст" + "парольпарольпа" = "(к+п)(а+а)...". Button1 шифрует текст из Memo1 с помощью пароля из Edit1. Button2 делает обратное. unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
s, s1: string;
i, l: integer;
begin
s := Memo1.Text;
s1 := Edit1.Text;
l := Length(s1);
for i := 1 to Length(s) do
s[i] := chr(ord(s[i]) + ord(s1[i mod l]));
Memo1.Text := s;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
s, s1: string;
i, l: integer;
begin
s := Memo1.Text;
s1 := Edit1.Text;
l := Length(s1);
for i := 1 to Length(s) do
s[i] := chr(ord(s[i]) - ord(s1[i mod l]));
Memo1.Text := s;
end;
end.
Как сделать так, чтобы текст всегда умещался на кнопке?Чтобы текст всегда умещался на кнопках нужно при запуске программы выставлять ширину кнопок (или любых других объектов) по ширене текста. procedure TForm1.FormCreate(Sender: TObject); begin Canvas.Font := Button1.Font; Button1.Width := Canvas.TextWidth(Button1.Caption) + 20; end;
Как реализовать кнопку "Отмена", чтобы прервать цикл?Для прерывания цикла существует операция break. При нажатии на кнопку "Отмена" я присваиваю true переменной Stop. А в цикле стоит сначала процедура Application.ProcessMessages, а потом проверка Stop. var
Stop: boolean;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
Stop := false;
for i := 0 to 100000000 do begin
Form1.Width := round(400 + 100 * sin(i / 1000));
Application.ProcessMessages;
if Stop then break;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Stop := true;
end;
email: delphi4all@narod.ru | |||