📄 ufundx.~pas
字号:
* 这样可以接受的解决了 虽然不是很完美但是还是实用
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PHanHuaDxDBGridGroupPanel(dxDBGridX:TdxDBGrid);
var
Str:String;
begin
if not dxDBGridX.ShowGroupPanel then Exit;
if dxDBGridX.GroupColumnCount > 0 then Exit;
Str:='托一列在此,可以按此列分组'
+' ';
dxDBGridX.Canvas.TextOut(4,7,Str);
end;
{oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 打印数据 用于票据等主要是通过 Cell32 的打印功能来打印
* 打印内容 >> 班次 发车时间 座位号 到站名 金额 终点站
* 手续费 (退票)
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* sSitNOs 座位号 一次可以传入多个 这样虚控制些效率高些 20031128
*------------------------------------------------------------------------------
* 为了实现灵活的打印 所以代码不做修改 可以编号对应内容
* 把编号写在Cell文件中 打印时候加载文件 找到编号 替换内容在打印
------------------------编码信息------------------------------------------------
* *****1 班次 2发车时间 3到站名 4 金额, 5 终点站 6 退票手续费*** 座位号*******
* 班次=01BC 发车时间hh:mm=02FCSJ 到站名=03DZM 金额=04JE
* 终点站=05ZDZ 发车时间YYYY=02YYYY 发车时间MM=02MM 发车时间DD=02DD
* 退票手续费=06TPSXF
* 座位号=07ZWH --------20031128------是个很好的办法
--------------------------------------------------------------------------------
* 发车时间要注意 订票 不是当日
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PPrintFromCell32(saTxt:array of String;//字符文本
iFlag,iSitCount:Integer; //标识
sSitNOs:String);//Cell文件名称 主要是预揽保存
var
I,J,iSitRow,iSitCol:Integer;
Cell32:TCell;
sCellFileName,Str,sDateYMD,sDatehhmm:String;
oleTemp:OleVariant;
begin
iSitRow:=0;
iSitCol:=0;
Cell32:=TCell.Create(nil);
Cell32.DoLogin(WideString('TOPGROUP INC.'), 182, WideString('A404900198056D05FC031F08A70C'));
sDateYMD:=MyCutString(True,saTxt[1]);
sDatehhmm:=MyCutString(False,saTxt[1]);
{*********************** 处理传入的打印数据 *************************}
{1 班次 2发车时间 3到站名 4 金额,5 终点站 6 退票手续费** 座位号***}
//打印 售票车票 预订 补票 售票
if iFlag = 201 then sCellFileName:=ExtractFilePath(Application.ExeName)+'PrintBill201.cll';
if iFlag = 202 then sCellFileName:=ExtractFilePath(Application.ExeName)+'PrintBill202.cll';
if not FileExists(sCellFileName) then Exit;
if Cell32.DoOpenFile(sCellFileName) < 0 then begin
DlgWarningX('打开文件出错');
Exit;
end;
for I:=0 to Cell32.Rows-1 do begin ///00000000000000置换车票信息;
for J:=0 to Cell32.Cols-1 do begin
Cell32.DoGetCellData(J,I,oleTemp);//Cell 是(列,行)
Str:=oleTemp;Str:=Trim(Str);
if Str = '01BC' then Cell32.DoSetCellString(J,I,saTxt[0]); //班次=01BC
if Str = '02FCSJ' then Cell32.DoSetCellString(J,I,sDatehhmm); //发车时间hh:mm=02FCSJ
if Str = '03DZM' then Cell32.DoSetCellString(J,I,saTxt[2]); //到站名=03DZM
if Str = '04JE' then Cell32.DoSetCellString(J,I,saTxt[3]); //金额=04JE
if Str = '05ZDZ' then Cell32.DoSetCellString(J,I,saTxt[4]); //终点站=05ZDZ
if Str = '06TPSXF' then Cell32.DoSetCellString(J,I,saTxt[5]); //退票手续费=06TPSXF
//发车时间YYYY=02YYYY 发车时间MM=02MM 发车时间DD=02DD //时间分3 个位置来打印
if Str = '02YYYY' then Cell32.DoSetCellString(J,I,Copy(sDateYMD,1,4));
if Str = '02MM' then Cell32.DoSetCellString(J,I,Copy(sDateYMD,6,2));
if Str = '02DD' then Cell32.DoSetCellString(J,I,Copy(sDateYMD,9,2));
if Str = '07ZWH' then begin//座位号=07ZWH//记录下来 座位可能不只一个
iSitRow:=I;
iSitCol:=J;
end;
end;
end;
for I:=0 to iSitCount-1 do begin//因为可能有空做位号 所以必须传座位号
Str:=FZGetOrderStr(Trim(sSitNOs),' ',I);
Cell32.DoSetCellString(iSitCol,iSitRow,Str);
if not FPrintCell32(Cell32) then begin Cell32.Free;Exit;end;
end;
{oooooooooooooooooooooooooooo打印oooooooooooooooooooooooooooooooooooo}
Cell32.Free;
end;
{*********************************** 打印 ***********************************}
function FPrintCell32(CellX:TCell):Boolean;
begin
Result:=False;
CellX.DoRedrawAll();
try
//CellX.DoPrintPreview(False);
//CellX.DoPrint(False);
Result:=True;
except
DlgWarningX('打印车票出错');
end;
end;
{oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 把 DXDBGrid 设置为只读 用再统计分析
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PSetDxDBGridReadOnly(dxDBGrid1:TdxDBGrid);
var
I:Integer;
begin
dxDBGrid1.OptionsView:=dxDBGrid1.OptionsView+[edgoRowSelect];
for I:=0 to dxDBGrid1.ColumnCount-1 do begin
//dxDBGrid1.Columns[I].ReadOnly:=False;
end;
end;
Procedure PSetFormDxDBGridReadOnly(FrmX:TForm);//把整个窗体上的表格设置为只读
var
I:Integer;
begin
for I:=0 to FrmX.ComponentCount-1 do begin
if FrmX.Components[I] is TdxDBGrid then
PSetDxDBGridReadOnly(TdxDBGrid(FrmX.Components[I]));
end;
end;
{ooooooooooooooooooooooooooooo 导出为Excel ooooooooooooooooooooooooooooo}
Procedure PExportDxGridToExcel(dxDBGridX:TdxDBGrid);
var
dlgSave:TSaveDialog;
Str:String;
begin
dlgSave:=TSaveDialog.Create(nil);
dlgSave.Filter:='Excel文件|*.xls';
if not dlgSave.Execute then begin
dlgSave.Free;
Exit;
end;
Str:=LowerCase(dlgSave.FileName);
Str:=MyCutOutStringB('.xls',Str)+'.xls';
dxDBGridX.SaveToXLS(Str, True);
dlgSave.Free;
end;
{oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 初始化记录对应的编辑筐 用非感应控件 用感应控件的问题太多了
* 这种情况应该字段数量不多 编辑筐种类应少 20031222
-------------------------------------------------------------------------------
* 只处理字符对应的编辑筐
-------------------------------------------------------------------------------
* 这是三个很成功的函数 建立在 uDBIO 的基础上 失败的基础上
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PInitOneRecordCtr(saField:array of String;
aCtrX:array of TControl;
DataSetX:TDataSet);
var
Str:String;
I:Integer;
FDFind:TField;
begin
if High(saField) <> High(aCtrX) then begin
DlgWarningA('PInitOneRecordCtr=High(saField) <> High(aCtrX)');
Exit;
end;
if not DataSetX.Active then begin
DlgWarningA('PInitOneRecordCtr=not DataSetX.Active');
Exit;
end;
for I:=0 to High(saField) do begin
Str:=saField[I];
FDFind:=DataSetX.FindField(Str);//找出相应的字段名
if FDFind = nil then begin
DlgWarningA('PInitOneRecordCtr=没有:'+Str);
Exit;
end;
{ooooooooooooo只处理字符ooooooooooooo}
if (FDFind.DataType = ftWideString) or (FDFind.DataType = ftString)
or (FDFind.DataType = ftMemo) then begin
if aCtrX[I] is TEdit then TEdit(aCtrX[I]).MaxLength:=FDFind.DataSize-1;
if aCtrX[I] is TMemo then TMemo(aCtrX[I]).MaxLength:=FDFind.DataSize-1;
if aCtrX[I] is TComboBox then TComboBox(aCtrX[I]).MaxLength:=FDFind.DataSize-1;
end;
end;
end;
{ooooooooooooooooooooooooooooooo 填充 oooooooooooooooooooooooooooooooooooooooo}
{ooooooooooooooooooooooooooooooo 可以 nil ooooooooooooooooooooooooooooooooooo}
Procedure PFillOneRecordCtr(saField:array of String;
aCtrX:array of TControl;
DataSetX:TDataSet);
var
Str,S:String;
I:Integer;
FDFind:TField;
begin
if High(saField) <> High(aCtrX) then begin
DlgWarningA('PInitOneRecordCtr=High(saField) <> High(aCtrX)');
Exit;
end;
if not DataSetX.Active then begin
DlgWarningA('PInitOneRecordCtr=not DataSetX.Active');
Exit;
end;
PInitOneRecordCtr(saField,aCtrX,DataSetX);
for I:=0 to High(saField) do begin
Str:=saField[I];
FDFind:=DataSetX.FindField(Str);//找出相应的字段名
if FDFind = nil then begin
DlgWarningA('PInitOneRecordCtr=没有:'+Str);
Exit;
end;
S:=Trim(DataSetX.FieldByName(Str).AsString);
if (DataSetX.State <> dsBrowse) and (DataSetX.State <> dsEdit) then S:='';
if aCtrX[I] is TEdit then (TEdit(aCtrX[I])).Text:=S;
if aCtrX[I] is TComboBox then begin
//(TComboBox(aCtrX[I])).Text:=S;
MySetComBoBoxTXT(TComboBox(aCtrX[I]),S);//200401 Edit Fulin
end;
if aCtrX[I] is TMemo then (TMemo(aCtrX[I])).Text:=S;
if aCtrX[I] is TStaticText then (TStaticText(aCtrX[I])).Caption:=S;
if aCtrX[I] is TLabel then TLabel(aCtrX[I]).Caption:=S;
if (aCtrX[I] is TDateTimePicker) And (S <> '') then
(TDateTimePicker(aCtrX[I])).Date:=StrToDate(S);
if aCtrX[I] is TCheckBox then begin //感悟
if TCheckBox(aCtrX[I]).Hint = S then TCheckBox(aCtrX[I]).Checked:=True;
if TCheckBox(aCtrX[I]).Hint <> S then TCheckBox(aCtrX[I]).Checked:=False;
end;
end;
end;
{********** 把控件的直 付给数据原 不 POSt ********************}
Procedure POneRecordCtrToDBSoure(saField:array of String;
aCtrX:array of TWinControl;
DataSetX:TDataSet);
var
Str,S:String;
I:Integer;
FDFind:TField;
begin
if High(saField) <> High(aCtrX) then begin
DlgWarningA('PInitOneRecordCtr=High(saField) <> High(aCtrX)');
Exit;
end;
if not DataSetX.Active then begin
DlgWarningA('PInitOneRecordCtr=not DataSetX.Active');
Exit;
end;
for I:=0 to High(saField) do begin
Str:=saField[I];
FDFind:=DataSetX.FindField(Str);//找出相应的字段名
if FDFind = nil then begin
DlgWarningA('PInitOneRecordCtr=没有:'+Str);
Exit;
end;
S:=Trim(DataSetX.FieldByName(Str).AsString);
if (DataSetX.State = dsBrowse) then Exit;//
if aCtrX[I] is TEdit then S:=(TEdit(aCtrX[I])).Text;
if aCtrX[I] is TComboBox then S:=(TComboBox(aCtrX[I])).Text;
if aCtrX[I] is TMemo then S:=(TMemo(aCtrX[I])).Text;
if aCtrX[I] is TStaticText then S:=(TStaticText(aCtrX[I])).Caption;
if aCtrX[I] is TDateTimePicker then
S:=FZDateStr((TDateTimePicker(aCtrX[I])).Date,False);
if aCtrX[I] is TCheckBox then begin //感悟
if TCheckBox(aCtrX[I]).Checked then S:=TCheckBox(aCtrX[I]).Hint
else begin//智能人性 自动找金额一样
if TCheckBox(aCtrX[I]).Hint = '是' then S:='不是';
if TCheckBox(aCtrX[I]).Hint = '属于' then S:='不属于';
if TCheckBox(aCtrX[I]).Hint = '有' then S:='没有';
end;
end;
DataSetX.FieldByName(Str).AsString:=S;
end;
end;
{ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
* 焦点跳转很繁琐 用一个 通用的函数来解决 Tag 直来判断上下
* 注意第一个应该是 Tag = 1
-------------------------------------------------------------------------------
* FrmX.ControlCount 不能枚举出所有的控件 回忆晴百林
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
Procedure PSetFocusUpAndDown(bDown:Boolean;//True 下 False 上
EdtCtrl:TWincontrol; //当前控件
FrmX:TForm); //控件所在窗体 还是写出来 传的时候 Self
var
I,K,J:Integer;
begin
K:=-1;
if bDown then K:=EdtCtrl.Tag+1; //下一个
if not bDown then K:=EdtCtrl.Tag-1;//上一个
for I:=0 to FrmX.ComponentCount-1 do begin
if FrmX.Components[I].Tag = K then begin
if FrmX.Components[I] is TWincontrol then begin//纠错
IF FrmX.Components[I] Is TComboBox then begin//是下拉列表
if (TComboBox(FrmX.Components[I]).ItemIndex = 0)
And (not bDown) then begin
TWincontrol(FrmX.Components[I]).SetFocus;
Exit;
end;
J:=TComboBox(FrmX.Components[I]).Items.Count-1;
if (TComboBox(FrmX.Components[I]).ItemIndex = J)
And (bDown) then begin
TWincontrol(FrmX.Components[I]).SetFocus;
Exit;
end;
end;
TWincontrol(FrmX.Components[I]).SetFocus;
Exit;
end;
end;
end;
end;
{oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -