<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=StartprogrammingusingObjectPascal%3ANewsApplicationInObjectOriented</id>
	<title>StartprogrammingusingObjectPascal:NewsApplicationInObjectOriented - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=StartprogrammingusingObjectPascal%3ANewsApplicationInObjectOriented"/>
	<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=StartprogrammingusingObjectPascal:NewsApplicationInObjectOriented&amp;action=history"/>
	<updated>2026-05-01T07:48:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://trans.onionmixer.net/wiki/index.php?title=StartprogrammingusingObjectPascal:NewsApplicationInObjectOriented&amp;diff=389&amp;oldid=prev</id>
		<title>Onionmixer: SPOP 객체지향파스칼에서의뉴스프로그램 페이지 추가</title>
		<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=StartprogrammingusingObjectPascal:NewsApplicationInObjectOriented&amp;diff=389&amp;oldid=prev"/>
		<updated>2012-07-26T11:48:51Z</updated>

		<summary type="html">&lt;p&gt;SPOP 객체지향파스칼에서의뉴스프로그램 페이지 추가&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
===객체지향 파스칼에서의 뉴스 프로그램===&lt;br /&gt;
&lt;br /&gt;
이 예제에서는 객체지향 기법을 사용하여 뉴스 프로그램을 재작성하려고 합니다. 또한 뉴스를 여러 개의 파일로 분류해야 합니다.&lt;br /&gt;
&lt;br /&gt;
새로운 GUI 프로그램을 만들었고 &amp;#039;&amp;#039;oonews&amp;#039;&amp;#039;라고 이름 지었습니다.&lt;br /&gt;
&lt;br /&gt;
다음 예제는 뉴스 기능이 있는 &amp;#039;&amp;#039;TNews&amp;#039;&amp;#039; 클래스가 들어있는 새 유닛입니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
unit news;&lt;br /&gt;
&lt;br /&gt;
{$mode objfpc}{$H+}&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
  Classes, SysUtils;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
    TNewsRec = record&lt;br /&gt;
        ATime: TDateTime;&lt;br /&gt;
        Title: string[100];&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
    { TNews }&lt;br /&gt;
&lt;br /&gt;
    TNews = class&lt;br /&gt;
    private&lt;br /&gt;
        F: file of TNewsRec;&lt;br /&gt;
        fFileName: string;&lt;br /&gt;
    public&lt;br /&gt;
        constructor Create(FileName: string);&lt;br /&gt;
        destructor Destroy; override;&lt;br /&gt;
        procedure Add(ATitle: string);&lt;br /&gt;
        procedure ReadAll(var NewsList: TStringList);&lt;br /&gt;
        function Find(Keyword: string;&lt;br /&gt;
            var ResultList: TStringList): Boolean;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
{ TNews }&lt;br /&gt;
&lt;br /&gt;
constructor TNews.Create(FileName: string);&lt;br /&gt;
begin&lt;br /&gt;
    fFileName:= FileName;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
destructor TNews.Destroy;&lt;br /&gt;
begin&lt;br /&gt;
    inherited Destroy;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TNews.Add(ATitle: string);&lt;br /&gt;
var&lt;br /&gt;
    Rec: TnewsRec;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    AssignFile(F, fFileName);&lt;br /&gt;
    if FileExists(fFileName) then&lt;br /&gt;
    begin&lt;br /&gt;
        FileMode:= 2; // Read/write access&lt;br /&gt;
        Reset(F);&lt;br /&gt;
        Seek(F, FileSize(F));&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
        Rewrite(F);&lt;br /&gt;
    Rec.ATime:= Now;&lt;br /&gt;
    Rec.Title:= ATitle;&lt;br /&gt;
    Write(F, Rec);&lt;br /&gt;
    CloseFile(F);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TNews.ReadAll(var NewsList: TStringList);&lt;br /&gt;
var&lt;br /&gt;
    Rec: TnewsRec;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    NewsList.Clear;&lt;br /&gt;
    AssignFile(F, fFileName);&lt;br /&gt;
    if FileExists(fFileName) then&lt;br /&gt;
    begin&lt;br /&gt;
        Reset(F);&lt;br /&gt;
        while not Eof(F) do&lt;br /&gt;
        begin&lt;br /&gt;
            Read(F, Rec);&lt;br /&gt;
            NewsList.Add(DateTimeToStr(Rec.ATime) + &amp;#039; : &amp;#039; + Rec.Title);&lt;br /&gt;
        end;&lt;br /&gt;
        CloseFile(F);&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TNews.Find(Keyword: string; var ResultList: TStringList): Boolean;&lt;br /&gt;
var&lt;br /&gt;
    Rec: TnewsRec;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
    ResultList.Clear;&lt;br /&gt;
    Result:= False;&lt;br /&gt;
    AssignFile(F, fFileName);&lt;br /&gt;
    if FileExists(fFileName) then&lt;br /&gt;
    begin&lt;br /&gt;
        Reset(F);&lt;br /&gt;
        while not Eof(F) do&lt;br /&gt;
        begin&lt;br /&gt;
            Read(F, Rec);&lt;br /&gt;
            if Pos(LowerCase(Keyword), LowerCase(Rec.Title)) &amp;gt; 0 then&lt;br /&gt;
            begin&lt;br /&gt;
                ResultList.Add(DateTimeToStr(Rec.ATime) + &amp;#039; : &amp;#039; + Rec.Title);&lt;br /&gt;
                Result:= True;&lt;br /&gt;
            end;&lt;br /&gt;
        end;&lt;br /&gt;
        CloseFile(F);&lt;br /&gt;
    end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
메인 폼에 다음과 같이 &amp;#039;&amp;#039;편집 상자&amp;#039;&amp;#039;, &amp;#039;&amp;#039;콤보상자&amp;#039;&amp;#039;, &amp;#039;&amp;#039;세 개의 단추&amp;#039;&amp;#039;, &amp;#039;&amp;#039;메모&amp;#039;&amp;#039;, &amp;#039;두 개의 &amp;#039;&amp;#039;레이블 구성요소&amp;#039;&amp;#039;를 추가했습니다.&lt;br /&gt;
&lt;br /&gt;
[[image:lazarus_11.png]]&lt;br /&gt;
&lt;br /&gt;
메인 유닛에는 이 코드를 작성합니다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
unit main;&lt;br /&gt;
&lt;br /&gt;
{$mode objfpc}{$H+}&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
uses&lt;br /&gt;
    Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics,&lt;br /&gt;
        Dialogs, News, StdCtrls;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
&lt;br /&gt;
    { TForm1 }&lt;br /&gt;
&lt;br /&gt;
    TForm1 = class(TForm)&lt;br /&gt;
        btAdd: TButton;&lt;br /&gt;
        btShowAll: TButton;&lt;br /&gt;
        btSearch: TButton;&lt;br /&gt;
        cbType: TComboBox;&lt;br /&gt;
        edTitle: TEdit;&lt;br /&gt;
        Label1: TLabel;&lt;br /&gt;
        Label2: TLabel;&lt;br /&gt;
        Memo1: TMemo;&lt;br /&gt;
        procedure btAddClick(Sender: TObject);&lt;br /&gt;
        procedure btSearchClick(Sender: TObject);&lt;br /&gt;
        procedure btShowAllClick(Sender: TObject);&lt;br /&gt;
        procedure FormCreate(Sender: TObject);&lt;br /&gt;
    private&lt;br /&gt;
        { private declarations }&lt;br /&gt;
    public&lt;br /&gt;
        NewsObj: array of TNews;&lt;br /&gt;
        { public declarations }&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
    Form1: TForm1;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
{ TForm1 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
procedure TForm1.FormCreate(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
    i: Integer;&lt;br /&gt;
begin&lt;br /&gt;
    SetLength(NewsObj, cbType.Items.Count);&lt;br /&gt;
    for i:= 0 to High(NewsObj) do&lt;br /&gt;
        NewsObj[i]:= TNews.Create(cbType.Items[i] + &amp;#039;.news&amp;#039;);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TForm1.btAddClick(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
    NewsObj[cbType.ItemIndex].Add(edTitle.Text);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TForm1.btSearchClick(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
    SearchStr: string;&lt;br /&gt;
    ResultList: TstringList;&lt;br /&gt;
begin&lt;br /&gt;
    ResultList:= TStringList.Create;&lt;br /&gt;
    if InputQuery(&amp;#039;Search News&amp;#039;, &amp;#039;Please input keyword&amp;#039;, SearchStr) then&lt;br /&gt;
        if NewsObj[cbType.ItemIndex].Find(SearchStr, ResultList) then&lt;br /&gt;
        begin&lt;br /&gt;
            Memo1.Lines.Clear;&lt;br /&gt;
            Memo1.Lines.Add(cbType.Text + &amp;#039; News&amp;#039;);&lt;br /&gt;
            Memo1.Lines.Add(&amp;#039;--------------------------------------------------&amp;#039;);&lt;br /&gt;
            Memo1.Lines.Add(ResultList.Text);&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        Memo1.Lines.Text:= SearchStr + &amp;#039; not found in &amp;#039; +&lt;br /&gt;
            cbType.Text + &amp;#039; news&amp;#039;;&lt;br /&gt;
    ResultList.Free;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TForm1.btShowAllClick(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
    List: TStringList;&lt;br /&gt;
begin&lt;br /&gt;
    List:= TStringList.Create;&lt;br /&gt;
    NewsObj[cbType.ItemIndex].ReadAll(List);&lt;br /&gt;
    Memo1.Lines.Clear;&lt;br /&gt;
    Memo1.Lines.Add(cbType.Text + &amp;#039; News&amp;#039;);&lt;br /&gt;
    Memo1.Lines.Add(&amp;#039;-----------------------------------------------------------&amp;#039;);&lt;br /&gt;
    Memo1.Lines.Add(List.Text);&lt;br /&gt;
    List.Free;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);&lt;br /&gt;
var&lt;br /&gt;
    i: Integer;&lt;br /&gt;
begin&lt;br /&gt;
    for i:= 0 to High(NewsObj) do&lt;br /&gt;
        NewsObj[i].Free;&lt;br /&gt;
    NewsObj:= nil;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
initialization&lt;br /&gt;
    {$I main.lrs}&lt;br /&gt;
&lt;br /&gt;
end.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
앞의 예제에서 다음 사실들을 눈여겨 보도록 합니다.&lt;br /&gt;
&lt;br /&gt;
1. 사용 여부에 따라 할당하고, 확장하고, 축소하고, 없앨 수 있는 동적 배열을 사용했습니다. news 객체의 동적 배열을 다음과 같이 선언했습니다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
   NewsObj: array of TNews;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
실행 시간동안 사용하기 전에, SetLength 프로시저를 사용하여 초기화 하는 것이 좋습니다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
   SetLength(NewsObj, 10);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이는 배열에 10개 요소를 할당한다는 의미입니다.  이는 일반 배열의 선언과 유사합니다.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
   NewsObj: array [0 .. 9] of TNews;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
일반적인 배열의 크기는 프로그램이 실행하는 동안 항상 정해진 그대로 남아있지만, 동적 배열의 크기는 늘었다 줄었다 할 수 있습니다.&lt;br /&gt;
 이 예제에서는 콤보 상자에 존재하는 분류에 따라 배열을 초기화합니다.&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
   SetLength(NewsObj, cbType.Items.Count);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ComboBox.Items에 더 많은 분류를 추가하면, 동적 배열의 크기는 이에 따라 증가할 것입니다.&lt;br /&gt;
&lt;br /&gt;
2. TNews 형식은 클래스이며, 이것을 바로 사용할 수 없습니다. NewsObj와 같이 클래스의 객체 인스턴스를 선언해야 합니다.&lt;br /&gt;
&lt;br /&gt;
3. 프로그램의 마지막에는 객체를 릴리스 하고, 그 다음 동적 배열을 릴리스 했습니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;pascal&amp;quot;&amp;gt;&lt;br /&gt;
   for i:= 0 to High(NewsObj) do&lt;br /&gt;
      NewsObj[i].Free;&lt;br /&gt;
   NewsObj:= nil;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:StartprogrammingusingObjectPascal]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
	</entry>
</feed>