Перейти к содержанию

1001 и 1 вопрос по Дельфи


Apollon

Рекомендуемые сообщения

Umnik, что-то я тут подумал, а тебе точно нужно именно, то что ты спросил :huh: , а не вот это?

memo1.SetSelTextBuf(PChar('<b>'+memo1.SelText+'</b>'));

Т.е. получится как на форме ответа на форуме :unsure: Выделил текст и по нажатию на кнопку заключил его между символами кода.

 

Соответственно развивая код, ты можешь для разных кнопок сделать следующее:

procedure TForm2.Btn_B_Click(Sender: TObject);
begin
memo1.SetSelTextBuf(PChar('<b>'+memo1.SelText+'</b>'));
end;
procedure TForm2.Btn_Code_Click(Sender: TObject);
begin
memo1.SetSelTextBuf(PChar('<code>'+memo1.SelText+'</code>'));
end;
procedure TForm2.Btn_Quote_Click(Sender: TObject);
begin
memo1.SetSelTextBuf(PChar('<quote>'+memo1.SelText+'</quote>'));
end;

ну и так далее...

 

Осваиваю Дельфи-подобную IDE. Документации ужасно мало, посему вопросы тут.

Как по клику на спидбаттон:

1). получить позицию курсора

2). вставить слева и справа от него теги (<b></b>, например)

Речь о TMemo

Ссылка на комментарий
Поделиться на другие сайты

AZЪ, о, отлично. :huh: Сегодня гляну на работе.

 

AZЪ, тут нет SetSelTextBuf, только SelText

Соответственно

procedure TMainWindow.BoldClick(Sender: TObject);
begin
 TextFild.SelText := '<b>'+TextFild.SelText+'</b>';
end;

равно

procedure TMainWindow.BoldClick(Sender: TObject);
begin
 TextFild.SelText := '<b></b>';
end;

и ставит курсор после тегов. Но это уже лучше, чем ничего. В конце-концов, я могу вернуть его на x позиций назад :unsure:

 

Но есть function GetCursor: TCursor; virtual;

Может возможно его заюзать, чтобы не делать возврат курсора?

 

Пока так:

procedure TMainWindow.BoldClick(Sender: TObject);
begin
 TextFild.SelText := '<b></b>';
 TextFild.SelStart := TextFild.CaretPos.x-4;
end;

Быдлокод во все поля :) В принципе, можно процедуру отдельную сделать для тегов, а то сейчас на каждый спид баттон отдельная процедура %)

Изменено пользователем Umnik
Ссылка на комментарий
Поделиться на другие сайты

Отдельная процедура все равно будет в том или ином виде, т.к. отработка нажатия кнопки никуда не денется. Можешь написать функцию и вызывать её при нажатии любой кнопки. В эту функцию будешь передавать Caption или Name кнопки например, а в самом коде функции делать подстановку того или иного набора символов в TextFild.SelText := в зависимости от переданных значений.

Например:

function CodeIntoStr (name:string);
var code1: string; Lcode1:integer;
begin
if name='Bold' then code1:='b';
if name='Code' then code1:='code';
// тут много еще всяких кнопок обработать
Lcode1:=length(code1)+3;
TextFild.SelText := '<'+code1+'></'+code1+'>';
TextFild.SelStart := TextFild.CaretPos.x-Lcode1;
end;

procedure TMainWindow.BoldClick(Sender: TObject);
begin
CodeIntoStr(Bold.Caption); 
end;

Ссылка на комментарий
Поделиться на другие сайты

Я сделал так:

код:

 

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
 Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
 ComCtrls, Menus, StdCtrls, Buttons, ExtCtrls, PairSplitter;

type

 { TMainWindow }

 TMainWindow = class(TForm)
MainWindowMenu: TMainMenu;
CUT: TSpeedButton;
TextField: TMemo;
FileMenu: TMenuItem;
SaveFile: TMenuItem;
SaveAsFile: TMenuItem;
MenuItem12: TMenuItem;
PageSetup: TMenuItem;
PreviewDoc: TMenuItem;
PrintDoc: TMenuItem;
MenuItem16: TMenuItem;
RecentFiles: TMenuItem;
MenuItem18: TMenuItem;
MenuItem19: TMenuItem;
EditMenu: TMenuItem;
ExitProgramm: TMenuItem;
AboutWindow: TMenuItem;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ViewMenu: TMenuItem;
OptionsMenu: TMenuItem;
HelpMenu: TMenuItem;
NewDoc: TMenuItem;
NewWindow: TMenuItem;
OpenFile: TMenuItem;
ReopenFile: TMenuItem;
Bold: TSpeedButton;
Italic: TSpeedButton;
Strike: TSpeedButton;
Underline: TSpeedButton;
StatusBar1: TStatusBar;
ToolBar1: TToolBar;
procedure BoldClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ItalicClick(Sender: TObject);
procedure StrikeClick(Sender: TObject);
procedure UnderlineClick(Sender: TObject);
procedure EditTextBySpeedButton(TagCode: String; PosX: Integer);
 private
{ private declarations }
 public
{ public declarations }
 end; 

var
 MainWindow: TMainWindow;

implementation

{ TMainWindow }

procedure TMainWindow.FormCreate(Sender: TObject);
begin
 Self.TextField.Clear;
end;

procedure TMainWindow.EditTextBySpeedButton(TagCode: String; PosX: Integer);
begin
  TextField.SelText := TagCode;
  TextField.SelStart := TextField.CaretPos.x-PosX;
  TextField.SelLength := 0;
end;

procedure TMainWindow.ItalicClick(Sender: TObject);
begin
  EditTextBySpeedButton('<i></i>', 4);
end;

procedure TMainWindow.StrikeClick(Sender: TObject);
begin
  EditTextBySpeedButton('<s></s>', 4);
end;

procedure TMainWindow.UnderlineClick(Sender: TObject);
begin
  EditTextBySpeedButton('<u></u>', 4);
end;

procedure TMainWindow.BoldClick(Sender: TObject);
begin
 EditTextBySpeedButton('<b></b>', 4);
end;

initialization
 {$I unit1.lrs}

end.

 

Ссылка на комментарий
Поделиться на другие сайты

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
×
×
  • Создать...