2011-04-16 6 views
6

क्या कोई मुझे बता सकता है कि मैं टेक्स्ट फ़ाइल से मेमो में एक-एक करके वर्ण कैसे जोड़ सकता हूं? टेक्स्ट फ़ाइल में ग्रंथों के विभिन्न पैराग्राफ हैं। मैं पैराग्राफ के अंत तक प्रत्येक पैराग्राफ के पात्रों को एक-एक करके जोड़ना चाहता हूं। फिर 10 सेकंड के बाद मेमो में अगले पैराग्राफ को दिखाया जा सकता है।वर्णों को एक-एक करके TMEMo

धन्यवाद, सेई

उत्तर

11

आप शायद TTimer का उपयोग करेंगे। TTimer, TMemo और TButton को अपने फॉर्म पर छोड़ दें। तब

var 
    lines: TStringList; 
    pos: TPoint; 

const 
    CHAR_INTERVAL = 75; 
    PARAGRAPH_INTERVAL = 1000; 

procedure TForm6.Button1Click(Sender: TObject); 
const 
    S_EMPTY_FILE = 'You are trying to display an empty file!'; 
begin 
    Memo1.ReadOnly := true; 
    Memo1.Clear; 
    Memo1.Lines.Add(''); 
    pos := Point(0, 0); 
    if lines.Count = 0 then 
    raise Exception.Create(S_EMPTY_FILE); 
    while (pos.Y < lines.Count) and (length(lines[pos.Y]) = 0) do inc(pos.Y); 
    if pos.Y = lines.Count then 
    raise Exception.Create(S_EMPTY_FILE); 
    NextCharTimer.Enabled := true; 
end; 

procedure TForm6.FormCreate(Sender: TObject); 
begin 
    lines := TStringList.Create; 
    lines.LoadFromFile('C:\Users\Andreas Rejbrand\Desktop\Test.txt'); 
end; 

procedure TForm6.NextCharTimerTimer(Sender: TObject); 
begin 
    NextCharTimer.Interval := CHAR_INTERVAL; 

    Memo1.Lines[Memo1.Lines.Count - 1] := Memo1.Lines[Memo1.Lines.Count - 1] + lines[pos.Y][pos.X + 1]; 
    inc(pos.X); 

    if pos.X = length(lines[pos.Y]) then 
    begin 
    NextCharTimer.Interval := PARAGRAPH_INTERVAL; 
    pos.X := 0; 
    repeat 
     inc(pos.Y); 
     Memo1.Lines.Add(''); 
    until (pos.Y = lines.Count) or (length(lines[pos.Y]) > 0); 
    end; 

    if pos.Y = lines.Count then 
    NextCharTimer.Enabled := false; 
end; 

Animated sample image http://privat.rejbrand.se/autotype.gif

+0

+1 ऐसा लगता है कि आपको –

+0

+1, एंड्रियास मजेदार था। अब एनीमेशन? :) आगे क्या होगा? –

+0

+1 एंड्रियास, आप किस gif उत्पन्न करने के लिए उपयोग करते हैं? – jachguate

1

तरीके यह करने के लिए की बहुत सारी है, और मुझे यकीन है कि आप कैसे नई-पंक्तियों संभाल करने का इरादा नहीं है। हालांकि, सभी मार्ग TMemo.Lines तक पहुंचते हैं जो TStrings उदाहरण है जो अंतर्निहित विंडोज संपादन नियंत्रण से बातचीत करने के लिए आवश्यक विंडोज संदेशों को लपेटता है।

उदाहरण के लिए, इन दिनचर्या आपको शुरू करनी चाहिए।

procedure AddNewLine(Memo: TMemo); 
begin 
    Memo.Lines.Add(''); 
end; 

procedure AddCharacter(Memo: TMemo; const C: Char); 
var 
    Lines: TStrings; 
begin 
    Lines := Memo.Lines; 
    if Lines.Count=0 then 
    AddNewLine(Memo); 
    Lines[Lines.Count-1] := Lines[Lines.Count-1]+C; 
end; 
2

एक टाइमर के लिए एक धागा विकल्प है। पैराग्राफ के लिए फ़ाइल में 'कैरिज रिटर्न' टेस्ट करें:

const 
    UM_MEMOCHAR = WM_USER + 22; 

type 
    TForm1 = class(TForm) 
    Memo1: TMemo; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    procedure UMMemoChar(var Msg: TMessage); message UM_MEMOCHAR; 
    public 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

type 
    TCharSender = class(TThread) 
    private 
    FCharWait, FParWait: Integer; 
    FFormHandle: HWND; 
    FFS: TFileStream; 
    protected 
    procedure Execute; override; 
    public 
    constructor Create(FileName: string; CharWait, ParagraphWait: Integer; 
     FormHandle: HWND); 
    destructor Destroy; override; 
    end; 

constructor TCharSender.Create(FileName: string; CharWait, ParagraphWait: Integer; 
    FormHandle: HWND); 
begin 
    FCharWait := CharWait; 
    FParWait := ParagraphWait; 
    FFormHandle := FormHandle; 
    FFS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); 
    FreeOnTerminate := True; 
    inherited Create(False); 
end; 

destructor TCharSender.Destroy; 
begin 
    FFS.Free; 
    inherited; 
end; 

procedure TCharSender.Execute; 
var 
    C: Char; 
begin 
    while (FFS.Position < FFS.Size) and not Terminated do begin 
    FFS.Read(C, SizeOf(C)); 
    if (C <> #10) then 
     PostMessage(FFormHandle, UM_MEMOCHAR, Ord(C), 0); 

    if C = #13 then 
     Sleep(FParWait) 
    else 
     Sleep(FCharWait); 
    end; 
end; 

{TForm1} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Memo1.Clear; 
    TCharSender.Create(
     ExtractFilePath(Application.ExeName) + 'text.txt', 20, 1000, Handle); 
end; 

procedure TForm1.UMMemoChar(var Msg: TMessage); 
begin 
    Memo1.SelStart := Memo1.Perform(WM_GETTEXTLENGTH, 0, 0); 
    Memo1.Perform(WM_CHAR, Msg.WParam, 0); 
end; 
+0

+1। मैं वास्तव में एक टाइमर के बजाय एक थ्रेड (और संदेश) का उपयोग करने पर विचार किया, लेकिन फैसला किया कि यह overkill था! –

संबंधित मुद्दे