На главную

Ответы на ваши вопросы

Ответы на ваши вопросы

ЗАДАТЬ ВОПРОС    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
Hosted by uCoz