Текущий архив: 2006.12.17;
Скачать: CL | DM;
ВнизПомогите разобраться с компонентами Найти похожие ветки
← →
Maloric (2006-03-02 20:37) [0]Добрый вечер!
Никак не могу понять как сделать компонент.
У меня есть визуальный компонент от предка TMemo,
как сделать такой же для Kol и Mck. Может я наконец разбирусь как их создавать.
interface
uses Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
TFileMemo = class(TMemo)
private
FFileName: string;
FCrypt: boolean;
procedure Shifr(var s: string);
procedure DeShifr(var s: string);
protected
public
procedure Load;
procedure Save;
published
constructor Create(aOwner:TComponent); override;
property FileName:string read FFileName write FFileName;
property Crypt:boolean read FCrypt write FCrypt;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("Maloric", [TFileMemo]);
end;
constructor TFileMemo.Create(aOwner:TComponent);
begin
inherited create(Aowner);
end;
procedure TFileMemo.Shifr(var s:string);
begin
{процедура шифровния}
end;
procedure TFileMemo.DeShifr(var s:string);
{процедура расшифровки}
end;
procedure TFileMemo.Load;
var f1:System.text;
s:string;
begin
if FFileName<>"" then begin
Lines.Clear;
WordWrap:=false;
AssignFile(f1,FFileName);
ReSet(f1);
while not eof(f1) do begin
ReadLn(f1,s);
DeShifr(s);
Lines.Add(s);
end;
CloseFile(f1);
end;
end;
procedure TFileMemo.Save;
var f1:System.text;
s:string;
i:integer;
begin
if FFileName<>"" then begin
AssignFile(f1,FFileName);
Rewrite(f1);
for i:=0 to Lines.Count-1 do begin
s:=Lines[i];
Shifr(s);
WriteLn(f1,s);
end;
CloseFile(f1);
end;
end;
end.
← →
ecm © (2006-03-02 22:28) [1]Читаем, разбираемся, применяем полученные знания:
http://bonanzas.rinet.ru/art003.htm
http://bonanzas.rinet.ru/WritingComp.htm
http://www.kolnmck.ru/lessons/createcomp1.shtml
и скоро должно(или уже?) появится в книге
http://bonanzas.rinet.ru/KOLBook.rar
:))
← →
ECM © (2006-03-02 23:05) [2]з.ы.
ИМХО для этого случая - я бы не создавал наследника Memo. Лучше взять стандартный, а для чтения-записи (шифровки-дешифровки) создал бы специальный CryptFileStream при помощи _NewStream , где и определил процедуры (StreamMethods) для шифрованного доступа
← →
z007 (2006-03-03 00:09) [3]Какой вопрос - такой ответ:
unit KOL_CryptMem;
//KOL Control CopyLeft (c)2006 z007
interface
uses kol;
type
PCryptMemo=^TCryptMemo;
TKOLCryptMemo = PCryptMemo;
TCryptMemo = object (TControl)
public
function Load(aFileName: string; doCrypt: boolean): boolean;
function Save(aFileName: string; doCrypt: boolean): boolean;
end;
implementation
function TCryptMemo.Load(aFileName: string; doCrypt: boolean): boolean;
var S : String;
i : integer;
begin
{Sample :)}
Result:=False;
if not doCrypt then exit;
S:=StrLoadFromFile(aFileName);
for i:=1 to Length(S) do
if not (ord(S[i]) in [0, 1, 13, 14, 10, 11, 255]) then
S[i]:=Chr(Ord(S[i]) - 1);
Text:=S;
Result:=True;
end;
function TCryptMemo.Save(aFileName: string; doCrypt: boolean): boolean;
var S : String;
i : integer;
begin
{Sample :)}
Result:=False;
if not doCrypt then exit;
S:=Text;
for i:=1 to Length(S) do
if not (ord(S[i]) in [0, 13, 12, 10, 9, 254, 255]) then
S[i]:=Chr(Ord(S[i]) + 1);
StrSaveToFile(aFileName, S);
Result:=True;
end;
end.
unit mckCryptMemo;
//MCK Mirror Control CopyLeft (c)2006 z007
interface
uses kol, mckCtrls, KOL_CryptMem, mckObjs, mirror, Classes;
type
TKOLCryptMemo = class(TKOLMemo)
protected
function AdditionalUnits: string;override;
procedure SetupFirst(SL: TStringList; const AName, AParent, Prefix: String); override;
procedure SetupConstruct(SL: TStringList; const AName, AParent,
Prefix: String); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("Maloric", [TKOLCryptMemo]);
end;
function TKOLCryptMemo.AdditionalUnits: string;
begin
result := inherited AdditionalUnits + ", KOL_CryptMem"
end;
procedure TKOLCryptMemo.SetupConstruct(SL: TStringList; const AName,
AParent, Prefix: String);
var S: String;
begin
{
asm
jmp @@e_signature
DB "#$signature$#", 0
DB "TKOLCustomControl.SetupConstruct", 0
@@e_signature:
end;
}
S := GenerateTransparentInits;
SL.Add( Prefix + AName + " := PCryptMemo( New" + TypeName + "( "
+ SetupParams( AName, AParent ) + " )" + S + ");" );
end;
procedure TKOLCryptMemo.SetupFirst;
begin
inherited;
end;
end.
Unit1
<...>
const fn="c:\kol\dem~o\mm.txt";
procedure TForm1.ButtonSave(Sender: PObj);
begin
cm.Save(fn, true);
end;
procedure TForm1.ButtonLoad(Sender: PObj);
begin
if fileexists(fn) then
cm.Load(fn, true);
end;
<...>
← →
z007 (2006-03-03 00:10) [4]2 ECM:
А не приведет ли создание для этого CryptFileStream к излишнему увеличению кода?
← →
Владимир Кладов (2006-03-03 06:34) [5]Может и приведет. Создание наследника обычно приводит к добавлению в код программы еще одного экземпляра vmt. Кажется, даже в случае, если нет новых виртуальных методов. Хотя в этом случае я могу ошибаться, и еще это может зависеть от версии Delphi. В любом случае дешевле добавить пару глобальных функций, а не методов. Какой прок в создании целого объектного типа или класса? Если кроме этих двух новых методов ничего не добавляется. Зато при наличии глобадбных функций у вас появится возможность использовать их и для rich edit, и для какого-либо гораздо более богатого потенциального наследника edit/memo/rich, если он кем-то будет сделан.
← →
Maloric (2006-03-03 11:14) [6]z007
Интересный пример, спасибо.
Но вот только, ошибка при установке, компонента z007[Error] Never-build package "CryptMemoD6" requires always-build package "MirrorKOLPackageD6"
← →
ECM © (2006-03-03 11:25) [7]Откройте пакет MirrorKOLPackageD6, в опциях проекта установите "Explicit rebuild" и пересоберите его...
← →
Maloric (2006-03-03 11:27) [8]Извините, проблему нашел, изменил опции компилятора как написанно в Faq-е.
И все таки
> http://bonanzas.rinet.ru/WritingComp.htm
> http://www.kolnmck.ru/lessons/createcomp1.shtml
не очень понятно изложенно все. Надо хотя бы добавить простейший пример, а то я написал компонент у меня текста вышло в два раза больше чем у z007, и не работает.
Спасибо.
← →
ECM © (2006-03-03 11:50) [9]
> не очень понятно изложенно все. Надо хотя бы добавить простейший
> пример
Возьметесь за написание простого примера и ясной и понятной статьи к нему?
С удовольствием помещу её на kolnmck.ru :))
← →
z007 (2006-03-04 19:34) [10]Возьмусь. Какой объем? Куда слать?
← →
MTsv DN © (2006-03-04 20:02) [11]Привет...
[i]> Возьмусь. Какой объем? Куда слать?[/i]
ECM или мне...
Объем, думаю, любой... Самое главное, чтобы было понятно, просто и "без воды"...
С Уважением MTsv DN
Страницы: 1 вся ветка
Текущий архив: 2006.12.17;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.046 c