Ответы на ваши вопросы |
ЗАДАТЬ ВОПРОС    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 |