如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

          CowNew開源團(tuán)隊(duì)

          http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks

          公告

          “如鵬教育”(http://www.RuPeng.com )是一個(gè)為計(jì)算機(jī)、信息等IT類專業(yè)在校大學(xué)生服務(wù)的學(xué)習(xí)社區(qū)。 每周舉辦免費(fèi)講座,為大一新生答疑解惑,幫大二、大三學(xué)生解決學(xué)習(xí)問題,幫同學(xué)提高實(shí)戰(zhàn)開發(fā)能力,幫大四學(xué)生增強(qiáng)求職技巧,成功應(yīng)聘名企。

          常用鏈接

          留言簿(83)

          隨筆分類

          隨筆檔案

          新聞檔案

          相冊(cè)

          友情鏈接

          團(tuán)隊(duì)成員

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

           

          現(xiàn)在網(wǎng)上有很多提供主頁空間的站點(diǎn),但是大部分低價(jià)位的站點(diǎn)只提供靜態(tài)HTML文檔的功能,不支持ASPPHP等動(dòng)態(tài)網(wǎng)頁技術(shù)。如果您像在您的主頁上放上您喜歡的文章,那么需要一個(gè)一個(gè)鏈接的做。如果您刪除了某篇文章或者想添加某篇文章,那么需要做很多改動(dòng),牽一發(fā)而動(dòng)全身。

            凌科文章動(dòng)態(tài)發(fā)布系統(tǒng)就是為你解決這個(gè)問題而開發(fā)的軟件。使用本軟件后您可以輕易生成下面效果的網(wǎng)頁。

          ///////////////////////////////////

          Delphi的使用幫助文件

           

          最后一篇情書

           

          上一頁

          //////////////////////////////////

          凌科文章動(dòng)態(tài)發(fā)布預(yù)覽

           

          凌科文章動(dòng)態(tài)新技術(shù)發(fā)

           

          下一頁

          /////////////////////////////////

          點(diǎn)擊相應(yīng)的文章標(biāo)題(如"最后一篇情書 ")就會(huì)彈出一個(gè)窗口顯示這篇文章。

           

          軟件的界面如下:

           

           aap1.jpg

          這款軟件有兩項(xiàng)關(guān)鍵性技術(shù):瘦客戶端的數(shù)據(jù)庫應(yīng)用和網(wǎng)頁分頁顯示技術(shù)。其中的瘦客戶端的數(shù)據(jù)庫應(yīng)用在我的另一款軟件《凌科網(wǎng)頁精靈》的“程序自動(dòng)升級(jí)”功能中也有所應(yīng)用。

          一、瘦客戶端的數(shù)據(jù)庫應(yīng)用

          本軟件的一個(gè)基本要求就是用戶可是隨時(shí)在工程添加、刪除文章,并能將工程保存到文件中,并可以在以后打開工程文件后繼續(xù)編輯工程。實(shí)現(xiàn)這個(gè)功能可以有很多中解決方案:

          1  定義一個(gè)結(jié)構(gòu)體TariticleItem(因?yàn)橐獙⑽恼卤4娴?/SPAN>ListBoxItem屬性中,所以要用類來模擬結(jié)構(gòu)體)

          TariticleItem = class

          Public

            Title: string;

            Ariticle: string;

          End;

          將用戶輸入的標(biāo)題和文章正文存儲(chǔ)在一個(gè)TariticleItem,然后再調(diào)用ListBox.Item.Add()將此TariticleItem保存到ListBox 中,在保存工程的時(shí)候遍歷ListBox中每個(gè)項(xiàng)目然后保存到文件。在加載工程文件時(shí)也類似的遍歷項(xiàng)目。

          但是這樣會(huì)使工作量變得很大,況且很有可能出現(xiàn)內(nèi)存問題(我猜測(cè)的,沒有實(shí)踐),而且保存的工程文件格式也會(huì)很難確定。

          2)用AccessMDB數(shù)據(jù)庫存儲(chǔ)文章,通過ADO操作數(shù)據(jù)庫。之所以選擇ADO訪問Access數(shù)據(jù)庫而不使用BDE的原因就是BDE的配置十分麻煩,在這種小規(guī)模的程序中使用BDE有點(diǎn)恐怖。而AccessADO驅(qū)動(dòng)在Win98以上操作系統(tǒng)中一般都有安裝,這樣就免去了配置的麻煩。而且使用TADOTableTADOQuerySaveToFileLoadFromFile方法也可以輕易實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出/導(dǎo)入文件。但是為什么我們不使用它呢?因?yàn)椤?/SPAN>Win98以上操作系統(tǒng)” “一般”都有安裝,這就說明Win95的用戶就不能使用本軟件了(現(xiàn)在還是有很多Win95用戶的),而且即使是Win98以上的系統(tǒng)也不能保證一定裝有ADO驅(qū)動(dòng)。

          3)使用Delphi中的TclientDataSet 控件。TClientDataSet控件繼承自TDataSet,具有所有數(shù)據(jù)集組件的基本功能,而且還有自己的很多很有用的功能,它是一款基于文件型數(shù)據(jù)存儲(chǔ)和操作的控件,數(shù)據(jù)可以導(dǎo)出到文件中(支持xmlcds兩種文件格式)。該控件封裝了對(duì)數(shù)據(jù)進(jìn)行操作處理的接口和功能,具有ADO的上述優(yōu)點(diǎn),基本上能滿足單機(jī)""數(shù)據(jù)庫應(yīng)用程序的需要。Delphi5的用戶在發(fā)布軟件時(shí)只要同時(shí)發(fā)布Midas.dll就可以了,Delphi6Delphi7的用戶只要在工程文件中包含MidasLib單元,Midas.dll的功能就集成在應(yīng)用程序中了(會(huì)使程序增大200K左右),成為真正的零配置軟件。況且使用TclientDataSet控件,我們就可以使用數(shù)據(jù)敏感組件,我們又免去了處理將保持用戶輸入數(shù)據(jù)更新的問題。基于以上原因,我決定使用TclientDataSet控件。

          aap2.jpg

          如上圖,在窗體中放入一個(gè)TclientDataSet控件提供數(shù)據(jù)、一個(gè)TdataSource控件、一個(gè)TDBGrid控件用來顯示文章標(biāo)題列表,一個(gè)TDBEdit控件顯示文章標(biāo)題,一個(gè)TDBMemo控件顯示文章內(nèi)容,并設(shè)定它們之間的關(guān)系。

          TclientDataSet組件上單擊右鍵,選擇“Fields Editor,在彈出的字段編輯器中單擊右鍵,選擇“New Field”,建一個(gè)名為TitleString類型字段和名為ArticleMemo類型字段。再在TclientDataSet組件上單擊右鍵,選擇“Create DataBase”。至此一個(gè)模擬數(shù)據(jù)庫就建好了,您可以調(diào)用TclientDataSetDelete,Edit,Insert等方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫操作了,還可以調(diào)用SaveToFileLoadFromFile方法保存、加載數(shù)據(jù)文件了。

          二、網(wǎng)頁分頁顯示技術(shù)

          網(wǎng)頁分頁顯示技術(shù)比較簡單,我現(xiàn)在也說得口干舌躁了,先給出代碼,你先自己分析一下吧!我將網(wǎng)頁分頁顯示封裝成了一個(gè)TarticlePublisher類,核心方法就是MakePublish方法,下面給出類的定義和MakePublish方法的代碼。

            TArticlePublisher = class(TObject)

            private

              FTitleWord: string;

              FIndexWord: string;

              FNumPerPage: Integer;

              FPageCount: Integer;

              FDataSet: TDataSet;

              FOutPutDir: string;

              FLinkFont: TFont;

              FUseDefFont: Boolean;

              FIndexTemplete: string;

              FLinkCSS: string;

              procedure FSetNumPerPage(AValue: Integer);

              procedure FSetLinkFont(AFont: TFont);

              procedure FSetUseDefFont(AValue: Boolean);

              procedure FSetIndexTemplete(AValue: string);

              procedure FSetLinkCSS(AValue: string);

            protected

              function AddFontToText(AText: string; AFont: TFont): string;virtual;

            public

              //輸出文章文件的文件名的開始幾個(gè)字符,默認(rèn)為'art'

              property TitleWord: string read FTitleWord write FTitleWord;

              //輸出索引文件的文件名的開始幾個(gè)字符,默認(rèn)為'ind'

              property IndexWord: string read FIndexWord write FIndexWord;

              //每頁的條目數(shù),默認(rèn)為30

              property NumPerPage: Integer read FNumPerPage write FSetNumPerPage;

              //總頁數(shù),只讀

              property PageCount: Integer read FPageCount;

              property DataSet: TDataSet read FDataSet write FDataSet;

              //輸出路徑

              property OutPutDir: string read FOutPutDir write FOutPutDir;

              //超鏈接字體

              property LinkFont: TFont read FLinkFont write FSetLinkFont;

              //使用默認(rèn)字體

              property UseDefFont: Boolean read FUseDefFont write FSetUseDefFont;

              //索引頁模板

              property IndexTemplete: string read FIndexTemplete write FSetIndexTemplete;

              //超鏈接CSS樣式

              property LinkCSS: string read FLinkCSS write FSetLinkCSS;

              constructor Create;

              procedure MakePublish;//開始轉(zhuǎn)化

            end;

           

           

          procedure TArticlePublisher.MakePublish;

          var

            LCount: Integer;

            i, j: Integer;

            LAriticleSL: TStringList;//保存文章用

            LStrList: TStringList;//保存動(dòng)態(tài)頁面用

            LTempStr: string;

          begin

            LCount := DataSet.RecordCount;

            DataSet.First;

           

            LAriticleSL := TStringList.Create;

            for i := 0 to LCount - 1 do

            begin

              LAriticleSL.Clear;

              LAriticleSL.Add(DataSet.FieldByName('Article').AsString);

              LAriticleSL.SaveToFile(Format('%s%s%d.htm',[OutPutDir,TitleWord,i]));

              DataSet.Next;

            end;

            LAriticleSL.Free;

           

            if LCount mod NumPerPage = 0 then

              FPageCount := LCount div NumPerPage

            else

              FPageCount := (LCount div NumPerPage) + 1;

           

            LStrList := TStringList.Create;

            DataSet.First;

           

            for i := 1 to PageCount do

            begin

              LStrList.Clear;

              for j := 0 to NumPerPage - 1 do

              begin

                if DataSet.Eof then break;

                LStrList.Add('<p>');

                if LinkCSS = '' then

                  LStrList.Add('<a href='+QuotedStr(TitleWord+IntToStr((i-1)*NumPerPage+j)+'.htm')+

                    ' target=_blank>'+AddFontToText(DataSet.FieldByName('Title').AsString,LinkFont)+'</a>')

                else

                  LStrList.Add('<a href='+QuotedStr(TitleWord+IntToStr((i-1)*NumPerPage+j)+'.htm')+

                    ' target=_blank style="'+LinkCSS+'">'+

                      AddFontToText(DataSet.FieldByName('Title').AsString,LinkFont)+'</a>');

           

                LStrList.Add('</p>');

                DataSet.Next;

              end;

              if i <> 1 then

                LStrList.Add('<a href='+QuotedStr(IndexWord+IntToStr(i-1)+'.htm')+

                  '>'+AddFontToText('上一頁', LinkFont)+'</a>');

              if i <> PageCount then

                LStrList.Add('<a href='+QuotedStr(IndexWord+IntToStr(i+1)+'.htm')+

                  '>'+AddFontToText('下一頁', LinkFont)+'</a>');

              if IndexTemplete <> '' then

              begin

                LTempStr := AnsiReplaceText(IndexTemplete, INDEXTEMPLETESIGN, LStrList.Text);

                LStrList.Text := LTempStr;

              end;

              LStrList.SaveToFile(Format('%s%s%d.htm',[OutPutDir,IndexWord,i]));

            end;

            LStrList.Free;

          end;

          二、其他經(jīng)驗(yàn)

          1將字體Tfont保存到Ini文件的方法。

          因?yàn)?/SPAN>vclTFont只是對(duì)windows FONT的封裝,它內(nèi)部所存儲(chǔ)的數(shù)據(jù)只是為了使用戶方便操作windowsfont而定義的一些私有狀態(tài)數(shù)據(jù),可以說這些數(shù)據(jù)與真正windows font中的數(shù)據(jù)風(fēng)馬牛不相及,你保存、恢復(fù)這些數(shù)據(jù)根本沒用(即使正確地恢復(fù)了這些數(shù)據(jù)也只會(huì)得到一個(gè)錯(cuò)誤的TFont對(duì)象)

          要保存TFont的內(nèi)容并能正確恢復(fù)最簡單的方法是保存TFont.Handle所對(duì)應(yīng)font的具體結(jié)構(gòu),恢復(fù)時(shí)根據(jù)這個(gè)結(jié)構(gòu)創(chuàng)建一個(gè)HFONT然后賦值給TFont.Handle即可。

          保存字體:

          var

            LFont: TFont;

            LLF: TLogFont;

            LMS: TMemoryStream;

          …………

          begin

             …………

              LFont := Edit1.Font;

              GetObject(LFont.Handle, SizeOf(LLF), @LLF);

              LMS.Write(LLF, SizeOf(LLF));

              LMS.Position := 0;//不能丟了這句

              LIni.WriteBinaryStream('Config', 'LinkFont', LMS);

            …………

          end;

          加載字體:

          var

            LFont: TFont;

            LLF: TLogFont;

            LMS: TMemoryStream;

          Begin

            …………

              LIni.ReadBinaryStream('Config', 'LinkFont', LMS);

              LMS.Position := 0;//不能丟了這句

              LMS.Read(LLF, SizeOf(LLF));

              LFont.Handle := CreateFontIndirect(LLF);

          …………

          End;

          但是這樣還有一個(gè)問題就是字體中的字體名、字體大小等屬性都能正確的保存,但是字體的顏色卻沒有保存。分析TlogFont發(fā)現(xiàn)原來系統(tǒng)原生對(duì)象TlogFont中并沒有顏色這個(gè)字段值,字體顏色是VCL封裝上去的,所以需要另外再在Ini文件增加一個(gè)字體顏色的項(xiàng)目。

          2、為一段文字加上HTML字體

          function AddFontToText(AText: string; AFont: TFont): string;

          Const

            LTmpl = '<font face="%s" size="%d" color="#%s">%s</font>';//模板

          var

            LColorStr: string;

            LR, LG, LB: Integer;

            tmp: string;

          begin

              LR := GetRValue(AFont.Color);

              LG := GetGValue(AFont.Color);

              LB := GetBValue(AFont.Color);

              LColorStr := Format('%x%x%x',[LR,LG,LB]);

              tmp := Format(LTmpl,[AFont.Name, AFont.Size, LColorStr,AText]);

           

              if fsBold in AFont.Style then

                tmp := Format('<b>%s</b>',[tmp]);

              if fsItalic      in AFont.Style then

                tmp := Format('<i>%s</i>',[tmp]);

              if fsUnderline in AFont.Style then

                tmp := Format('<u>%s</u>',[tmp]);

              if fsStrikeOut in AFont.Style then

                tmp := Format('<StrikeOut>%s</StrikeOut>',[tmp]);

              result := tmp;

          end;

           

           

           

           

           
            

           

           

           

           

           

          posted on 2005-10-22 00:42 CowNew開源團(tuán)隊(duì) 閱讀(928) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 淳安县| 南通市| 灌阳县| 卢湾区| 磐石市| 临夏县| 广南县| 庆城县| 山阴县| 黄大仙区| 信丰县| 浦城县| 多伦县| 克拉玛依市| 吉安市| 大余县| 固原市| 曲阜市| 哈尔滨市| 松溪县| 左贡县| 宣威市| 霍林郭勒市| 宿迁市| 伽师县| 泗水县| 中卫市| 建瓯市| 德江县| 英超| 枝江市| 错那县| 河北省| 抚远县| 辉县市| 江门市| 新丰县| 罗江县| 仁化县| 山东省| 黑龙江省|