?? syspublictmp.pas
字號:
unit SysPublicTmp;
interface
uses Windows;
implementation
end.
{
動畫顯示窗體
procedure TForm1.FormCreate(Sender: TObject);
begin
AnimateWindow(Handle,2000{速度:2秒}//,AW_BLEND);
{ AW_HOR_POSITIVE = $00000001;
AW_HOR_NEGATIVE = $00000002;
AW_VER_POSITIVE = $00000004;
AW_VER_NEGATIVE = $00000008;
AW_CENTER = $00000010;
AW_HIDE = $00010000;
AW_ACTIVATE = $00020000;
AW_SLIDE = $00040000;
AW_BLEND = $00080000;
end;}
{
只允許建立一次子窗體的MDI程序
procedure OpenChildForm(FormClass: TFormClass; var Fm; AOwner:TComponent);
var
I: Integer;
Child: TForm;
begin
for I := 0 to Screen.FormCount - 1 do
if Screen.Forms[I].ClassType = FormClass then
begin
Child := Screen.Forms[I];
if Child.WindowState = wsMinimized then
ShowWindow(Child.Handle, SW_SHOWNORMAL)
else
ShowWindow(Child.handle,SW_SHOWNA);
if (not Child.Visible) then Child.Visible := True;
Child.BringToFront;
Child.Setfocus;
TForm(Fm) := Child;
Exit;
end;
Child := TForm(FormClass.NewInstance);
TForm(Fm) := Child;
Child.Create(AOwner);
end;
}
{
數據網格自動適應寬度
說明:使用DBGrid不可不看
///////Begin Source
uses
Math;
function DBGridRecordSize(mColumn: TColumn): Boolean;
{ 返回記錄數據網格列顯示最大寬度是否成功
begin
Result := False;
if not Assigned(mColumn.Field) then Exit;
mColumn.Field.Tag := Max(mColumn.Field.Tag,
TDBGrid(mColumn.Grid).Canvas.TextWidth(mColumn.Field.DisplayText));
Result := True;
end;
function DBGridAutoSize(mDBGrid: TDBGrid; mOffset: Integer = 5): Boolean;
// 返回數據網格自動適應寬度是否成功
var
I: Integer;
begin
Result := False;
if not Assigned(mDBGrid) then Exit;
if not Assigned(mDBGrid.DataSource) then Exit;
if not Assigned(mDBGrid.DataSource.DataSet) then Exit;
if not mDBGrid.DataSource.DataSet.Active then Exit;
for I := 0 to mDBGrid.Columns.Count - 1 do begin
if not mDBGrid.Columns[I].Visible then Continue;
if Assigned(mDBGrid.Columns[I].Field) then
mDBGrid.Columns[I].Width := Max(mDBGrid.Columns[I].Field.Tag,
mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption)) + mOffset
else mDBGrid.Columns[I].Width :=
mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption) + mOffset;
mDBGrid.Refresh;
end;
Result := True;
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
DBGridRecordSize(Column);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DBGridAutoSize(DBGrid1);
end;
}
{TDBGrid中用Enter仿真Tab鍵盤
procedure TForm1.FormKeyPress(Sender: TObject; var Key:
Char);
begin
if Key = #13 then //如果是一個Enter鍵盤
begin
if not (ActiveControl is TDBGrid) then //如果當前的控件不是TDBGrid
begin
Key := #0;
Perform(WM_NEXTDLGCTL, 0, 0);
end
else if (ActiveControl is TDBGrid) then //在TDBGrid中
begin
with TDBGrid(ActiveControl) do
begin
if selectedindex < (fieldcount -1) then //如果不是最后一個字段
selectedindex := selectedindex +1
else
selectedindex := 0;
end;
end;
end;
end;
}
{
經常看到有人問如何把Delphi中的數據集導入Excel中,這里提供了一個實現。
在做項目時,很多情況下,客戶需要對程序中數據集再加工,再利用,如報表。
這時,就需要把DataSet導入到一個客戶比較熟悉的格式中去。Excel是首選了。
該程序在Delphi4,5下編譯通過,已被用在多個項目中。還被集成在筆者所寫的一個小組件TDBNavigateButton中
{-------------------------------------------------------------------------------------------------
單元:uExcelTools
作者: Bear
功能:保存數據集,如TTable,TQuery,TClientDataSet等為Excel文件,
包含標題,可以只將一部分字段導出
這一點通過設置DataSet中要不導出字段的Tag值大于某一個值來處理
原理:調用 Microsoft Excel Ole對象
調用方式:
Function DataSetToExcel(
DataSet:TDataSet;FieldTagMax:Integer;
Visible:Boolean;ExcelFileName:String=''): Boolean;
--------------------------------------------------------------------------------------------------
unit UExcelTools;
interface
uses
classes, comctrls, stdctrls, windows, Dialogs, controls, SysUtils,
Db,forms,DBClient,ComObj;
//把數據集導入ExcelSheet的核心函數
function DataSetToExcelSheet
(
DataSet :TDataSet;
FieldTagMax :Integer; // 字段的Tag值如果大于這個值,就不導出到Excel
Sheet :OleVariant
): Boolean;
//實際使用的函數,內部調用了DataSetToExcelSheet,在外面加入UI接口和錯誤處理
function DataSetToExcel
(
DataSet :TDataSet; // 要轉換的數據集
FieldTagMax :Integer; // 字段的Tag值如果大于這個值,就不導出到Excel
Visible :Boolean; // 是否讓做轉換工作的Excel可見
ExcelFileName:String='' // Excel文件名,*.xls
): Boolean;
implementation
Function DataSetToExcelSheet(DataSet:TDataSet;FieldTagMax:Integer;Sheet:OleVariant): Boolean;
var
Row,Col,FieldIndex :Integer;
BK:TBookMark;
begin
Result := False;
if not Dataset.Active then exit;
BK:=DataSet.GetBookMark;
DataSet.DisableControls;
Sheet.Activate;
try
// 列標題
Row:=1;
Col:=1;
for FieldIndex:=0 to DataSet.FieldCount-1 do
begin
if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
begin
Sheet.Cells(Row,Col) :=DataSet.Fields[FieldIndex].DisplayLabel;
Inc(Col);
end;
end;
// 表內容
DataSet.First;
while Not DataSet.Eof do
begin
Row:=Row+1;
Col:=1;
for FieldIndex:=0 to DataSet.FieldCount-1 do
begin
if DataSet.Fields[FieldIndex].Tag <= FieldTagMax then
begin
Sheet.Cells(Row,Col):=DataSet.Fields[FieldIndex].AsString;
Inc(Col);
end;
end;
DataSet.Next;
end;
Result := True;
finally
DataSet.GotoBookMark(BK);
DataSet.EnableControls;
end;
end;
Function DataSetToExcel(
DataSet:TDataSet;FieldTagMax:Integer;
Visible:Boolean;ExcelFileName:String=''): Boolean;
var
ExcelObj, Excel, WorkBook, Sheet: OleVariant;
OldCursor:TCursor;
SaveDialog:TSaveDialog;
begin
Result := False;
if not Dataset.Active then exit;
OldCursor:=Screen.Cursor;
Screen.Cursor:=crHourGlass;
try
ExcelObj := CreateOleObject('Excel.Sheet');
Excel := ExcelObj.Application;
Excel.Visible := Visible ;
WorkBook := Excel.Workbooks.Add ;
Sheet:= WorkBook.Sheets[1];
except
MessageBox(GetActiveWindow,'無法調用Mircorsoft Excel! '+chr(13)+chr(10)+
'請檢查是否安裝了Mircorsoft Excel。','提示',MB_OK+MB_ICONINFORMATION);
Screen.Cursor:=OldCursor;
Exit;
end;
Result:=DataSetToExcelSheet(DataSet,FieldTagMax,Sheet) ;
if Result then
if Not Visible then
begin
if ExcelFileName<>''
then WorkBook.SaveAs(FileName:=ExcelFileName)
else begin
SaveDialog:=TSaveDialog.Create(Nil);
SaveDialog.Filter := 'Microsoft Excel 文件|*.xls';
Result:=SaveDialog.Execute;
UpdateWindow(GetActiveWindow);
if Result then
WorkBook.SaveAs(FileName:=SaveDialog.FileName);
SaveDialog.Free;
end;
Excel.Quit;
end;
Screen.Cursor:=OldCursor;
end;
end.
}
{
如何創建透明窗體
procedure TForm1.FormCreate(Sender: TObject);
var
FullRgn, ClientRgn, ButtonRgn: THandle;
Margin, X, Y: Integer;
begin
Margin := (Width - ClientWidth) div 2;
FullRgn := CreateRectRgn(0, 0, Width, Height);
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
X := X + Button1.Left;
Y := Y + Button1.Top;
ButtonRgn := CreateRectRgn(X, Y, X + Button1.Width, Y + Button1.Height);
CombineRgn(FullRgn, FullRgn, ButtonRgn, RGN_OR);
SetWindowRgn(Handle, FullRgn, True);
end;
}
{
如何實現在MS Access數據庫中圖像的存儲和顯示
一、 原理介紹——流式數據的類型及其應用
在Dephi中提供了TStream來支持對流式數據的操作。TStream是萬流之源,但由于它是一個抽象類,故不能被直接使用;而要使用其相應的子類,如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、TWinSocketStream和TOleStream。TStream提供了統一、簡潔的方法來進行數據的讀寫。
1.)SaveToStream(Stream: TStream ); 作用:將類中的數據寫到Stream的當前位置中
2.)LoadFromStream(Stream: TStream); 作用:從當前位置讀入Stream里的數據
實際使用時我們基本上只要使用上面兩個函數就可以了。
二、所遇到的問題及相應的解決方法
為了節省圖像的存儲空間和使用更加方便,決定采用JPEG這種圖像格式。
(一)所遇到的問題
第一、在Delphi 5中進行畫圖所用到的組件是TImage,所生成的圖像的格式為BMP格式,而為了節省圖像的存儲空間,圖像在數據庫里存儲的格式須為JPEG格式,這樣就產生了圖像格式轉化的需求;而TImage本身并不直接提供這兩種圖像格式之間的轉化。
第二、怎樣將存儲在Microsoft Access數據庫中的圖像取出并且顯示出來:在Delphi 5中,能提供這種功能的組件是TDBImage,但該組件卻存在著一個很大的缺陷:它所能顯示的圖像類型只能是一些圖標文件,元文件和BMP文件,而不能支持JPEG格式的圖像在該組件中的顯示;但根據實際需要,在Microsoft Access數據庫中所存儲的圖像數據卻是以JPEG格式保存的。
(二)相應的解決方法
為了解決上述兩個問題,可以采用目前數據庫中一種名為大二分對象(BLOB——Binary Large Object),它是用來處理某些特殊格式的數據的。BLOB在數據庫的表中實際上是以二進制數據的形式存放的。
為了處理BLOB字段,可以借鑒一些可視的桌面數據庫的方法。在這里,我們選擇了通過內存流的方式來完成;使用內存流,可減少磁盤操作,大大提高運行效率。
具體的過程和相關的程序代碼如下:
1、如何實現在Microsoft Access數據庫中的圖像存儲:
這里是利用TStream的子類TMemoryStream向Microsoft Access數據庫中存儲圖像的。下面的這段代碼是在按了“保存”按鈕之后所觸發的事件處理程序:
procedure TForm1.Button1Click(Sender: TObject);
var
MyJPEG : TJPEGImage;
MS: TMemoryStream;
begin
MyJPEG := TJPEGImage.Create;
try
with MyJPEG do
begin
Assign(Image.Picture.Graphic);
MS:=TMemoryStream.create;
SaveToStream(MS);
MS.Position:=0;
Table1.Edit;
TBlobField(Table1.FieldbyName('Image')).LoadFromStream(MS);
Table1.Post;
messagebox(getactivewindow(),'圖像保存完畢!','保存',mb_ok);
end;
finally
MyJPEG.Free;
end;
end;
在這段代碼里TStream的子類TMemoryStream利用內存流起到了將BMP格式轉化為JPEG格式的中間橋梁的作用。
2、如何將圖像從Microsoft Access數據庫中取出并顯示出來:
下面的這段代碼是在按了“查看圖像”按鈕之后所觸發的事件處理程序:
procedure TForm1.Button1Click(Sender: TObject);
var tempstream:TStringStream;
tempjpeg:TJPEGImage;
begin
try
tempstream:=TStringStream.Create(' ');
TBlobField(Query1.FieldByName('Image')).SaveToStream(tempstream);
tempstream.Position:=0;
tempjpeg:=TJPEGImage.Create;
tempjpeg.LoadFromStream(tempstream);
DBImage1.Picture.Bitmap.Assign(tempjpeg);
finally
tempstream.Free;
tempjpeg.Free;
end;
end;
這段代碼的主要作用是:首先將查詢結果中的JPEG圖像格式數據保存到TStringStream中去,然后設置數據指針在TStringStream中的位置為0;接著從TStringStream中讀入相關數據,并把它們賦給TDBImage.Picture.Bitmap,這樣一來就實現了將數據庫中所存儲的JPEG格式的數據轉化為BMP格式,并在TDBImage中將圖像顯示出來。最后將TStringStream和TJPEGImage這兩個對象釋放掉。特別要注意的是不能在設計階段設置TDBImage的DataField屬性,而只能通過寫代碼的形式在運行階段把利用流式數據所轉化過來的新格式的圖像數據賦給TDBImage.Picture.Bitmap。
}
{在SQL數據庫里顯示序號
select IDENTITY(int,1,1)as id,房臺名稱,類型說明 into #1 from 房間臺號信息表
select * from #1
drop table #1--放到這里就行了
}
{
問題:SQL Server2000中,怎么得到datetime類型字段的日期部分和時間部分? ( 積分:50, 回復:8, 閱讀:38 )
分類:數據庫-C/S型 ( 版主:qince, luyear )
來自:nywjx, 時間:2004-8-23 10:01:00, ID:2774290 [顯示:小字體 | 大字體]
如題,一個字段是datetime類型,我想得到它的日期部分,就是2004-08-23;
還想得到它的時間部分,就是10:12:45,
怎么做啊?看了幫助,沒找到
來自:KervenLee, 時間:2004-8-23 10:09:17, ID:2774306
轉換成字符串,從后面取10個字符吧
笨方法!
來自:shineYu, 時間:2004-8-23 10:09:18, ID:2774307
convert(char(8),[datetime],102) --->2004.08.23
convert(char(8),[datetime],108) --->HH:MM:SS
來自:TYZhang, 時間:2004-8-23 10:10:01, ID:2774309
Select Convert(char(10),D,121) from T //2004-08-23
Select Right(Convert(char(19),D,121),8) from T //10:12:45
來自:nywjx, 時間:2004-8-23 10:12:15, ID:2774317
那我要進行時間變量之間的比較時,不是還要把字符轉換成datetime?有沒有更好的辦法?
來自:bluedna, 時間:2004-8-23 10:12:38, ID:2774319
select convert(varchar(10),getdate(),120)as 日期
select convert(varchar(10),getdate(),108)as 時間
來自:TYZhang, 時間:2004-8-23 10:16:21, ID:2774331
Select Floor(D) from T //2004-08-23
Select D-Floor(D) from T //10:12:45
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -