unit kirjain; interface uses Windows, Messages, SysUtils, Classes, Controls, ExtCtrls; type TKirjain = class(TPanel) private FNakyy: boolean; FKirjain: char; protected procedure SetKirjain(const Value: char); virtual; procedure SetNakyy(const Value: boolean); virtual; public published property Kirjain: char read FKirjain write SetKirjain; property Nakyy: boolean read FNakyy write SetNakyy default false; end; TSana = class; TOnKirjain = procedure (Sender: TSana; c: char) of object; TSana = class(TPanel) private FSana: string; FKirjaimet: array of TKirjain; tyhja: TKirjain; FOnKirjainOK: TOnKirjain; FOnKirjainVaarin: TOnKirjain; function GetKirjaimia: integer; protected procedure SetSana(const Value: string); virtual; function GetKirjaimet(i: integer): TKirjain; virtual; function UusiKirjain: TKirjain; virtual; // Tehtävä 1d function GetOikeita: integer; public constructor Create(AParent: TComponent); override; procedure LisaaKirjain(c: char); overload; virtual; procedure LisaaKirjain(s: string); overload; virtual; // Tehtävä 1c procedure LisaaSana(s: string); property Kirjaimet[i: integer]: TKirjain read GetKirjaimet; property Kirjaimia: integer read GetKirjaimia; published property Sana: string read FSana write SetSana; property OnKirjainOK: TOnKirjain read FOnKirjainOK write FOnKirjainOK; property OnKirjainVaarin: TOnKirjain read FOnKirjainVaarin write FOnKirjainVaarin; // Tehtävä 1d property Oikeita: integer read GetOikeita; end; procedure Register; implementation procedure Register; begin RegisterComponents('GKO', [TKirjain, TSana]); end; { TKirjain } procedure TKirjain.SetKirjain(const Value: char); begin FKirjain := Value; if Nakyy then Caption := Kirjain; end; procedure TKirjain.SetNakyy(const Value: boolean); begin FNakyy := Value; if Nakyy then Caption := Kirjain else Caption := ''; end; { TSana } constructor TSana.Create(AParent: TComponent); begin inherited; tyhja := TKirjain.Create(self); end; function TSana.GetKirjaimet(i: integer): TKirjain; begin Result := tyhja; if (i <= 0) or (i > length(sana)) then exit; Result := FKirjaimet[i-1]; end; function TSana.GetKirjaimia: integer; begin Result := Length(sana); end; procedure TSana.LisaaKirjain(c: char); var i, len: integer; vaarin: boolean; begin len := Length(sana); vaarin := true; for i := 1 to len do if (UpperCase(sana[i]) = UpperCase(c)) then begin vaarin := false; if (Kirjaimet[i].Nakyy = false) then begin Kirjaimet[i].Nakyy := true; if assigned(OnKirjainOK) then OnKirjainOK(self, c); end; end; if vaarin and assigned(FOnKirjainVaarin) then OnKirjainVaarin(self, c); end; function TSana.GetOikeita: integer; Var i: integer; begin Result := 0; for i := 0 to Kirjaimia Do if Kirjaimet[i].Nakyy then inc(result); end; procedure TSana.LisaaKirjain(s: string); begin if s = '' then exit; LisaaKirjain(s[1]); end; procedure TSana.LisaaSana(s: string); var i: integer; begin for i := 1 to length(s) do LisaaKirjain(s[i]); end; procedure TSana.SetSana(const Value: string); var i, len: integer; k: TKirjain; begin for i := 0 to pred(Kirjaimia) do kirjaimet[i].Free; FSana := Value; len := Length(Sana); SetLength(FKirjaimet, len); for i := 1 to len do begin k := UusiKirjain; k.Parent := self; k.Align := alLeft; k.left := 10000; k.Kirjain := Sana[i]; k.width := ClientHeight; k.Height := ClientHeight; FKirjaimet[i-1] := k; end; end; function TSana.UusiKirjain: TKirjain; begin Result := TKirjain.Create(self); end; end.