{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% osCommerce Product Manager for Windows (oscpmwin). Copyright ©2003-2006 by Mario A. Valdez-Ramirez. You can contact Mario A. Valdez-Ramirez by email at mario@mariovaldez.org or paper mail at Olmos 809, San Nicolas, NL. 66495, Mexico. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} unit runmod; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls, Buttons, ComCtrls, modules, Menus; CONST OPM_AUTOSTARTMOD = WM_USER + 1235; type Topm_Form_Runmod = class(TForm) opm_GroupBox_RunmodMain: TGroupBox; opm_BitBtn_RunmodCancel: TBitBtn; opm_ProgressBar_Runmod: TProgressBar; opm_Label_RunmodStatus: TLabel; opm_GroupBox_RunmodConfirm: TGroupBox; opm_ListView_RunmodConfirm: TListView; opm_BitBtn_RunmodConfirm: TBitBtn; opm_PopupMenu_Runmod: TPopupMenu; opm_PopMenuItem_RunmodCopy: TMenuItem; opm_PopMenuItem_RunmodCopyDiff: TMenuItem; opm_PopMenuItem_RunmodCopyEqual: TMenuItem; opm_PopMenuItem_RunmodCopyUnknown: TMenuItem; opm_PopMenuItem_RunmodCopyRestricted: TMenuItem; opm_StatusBar_PEdit: TStatusBar; opm_Memo_RunmodDetails: TMemo; procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); procedure opm_BitBtn_RunmodConfirmClick(Sender: TObject); procedure opm_PopMenuItem_RunmodCopyClick(Sender: TObject); procedure opm_PopMenuItem_RunmodCopyDiffClick(Sender: TObject); procedure opm_PopMenuItem_RunmodCopyEqualClick(Sender: TObject); procedure opm_PopMenuItem_RunmodCopyUnknownClick(Sender: TObject); procedure opm_ListView_RunmodConfirmColumnClick(Sender: TObject; Column: TListColumn); procedure opm_PopMenuItem_RunmodCopyRestrictedClick(Sender: TObject); procedure opm_ListView_RunmodConfirmCustomDrawItem( Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); private PROCEDURE PRopm_Create_ConfirmExportList (VAR ExportString : STRING; VAR ExportList : opmT_ExchangeList; SelectType : LONGINT); public PROCEDURE AutoStart (VAR AutoStartMsg: TMessage); MESSAGE OPM_AUTOSTARTMOD; FUNCTION opm_FNFeedModule : BOOLEAN; PROCEDURE PRopm_RenderConfirmDisplay (VAR SyncList : opmT_ExchangeList; VAR ListControl : TListView); PROCEDURE PRopm_CleanExchangeList (VAR SyncList : opmT_ExchangeList); end; var opm_Form_Runmod : Topm_Form_Runmod; opm_Runmod_CanClose : BOOLEAN; opm_Runmod_CanSync : BOOLEAN; opm_Runmod_Stat : STRING; opm_Runmod_LastOrderColumn : LONGINT; opm_Runmod_LastOrderType : BOOLEAN; FUNCTION FNopm_Sort_ExchangeList (Item1, Item2: TListItem; Column: INTEGER) : INTEGER; STDCALL; implementation Uses gnugettext, main, oscpmdata, dataman, clipbrd, network; {$R *.dfm} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} FUNCTION Topm_Form_Runmod.opm_FNFeedModule : BOOLEAN; VAR ExcCount : LONGINT; QueryData, RespData : STRING; RespType : LONGINT; BEGIN opm_FNFeedModule := TRUE; opm_ProgressBar_Runmod.Min := 0; opm_ProgressBar_Runmod.Max := (opmG_TotalExchangeItems - 1); opm_ProgressBar_Runmod.Step := ROUND (opmG_TotalExchangeItems / 20); opm_ProgressBar_Runmod.Position := 0; FOR ExcCount := 0 TO (opmG_TotalExchangeItems - 1) DO BEGIN QueryData := opmG_ExchangeList[ExcCount].IndexString; REPEAT RespType := opm_FNQueryMod (QueryData, RespData); CASE RespType OF opmC_ModRet_Null : BEGIN opm_FNFeedModule := FALSE; BREAK; END; opmC_ModRet_Stat : opm_Runmod_Stat := opm_Runmod_Stat + #13#10 + RespData; opmC_ModRet_Data : BEGIN IF ((RespData = opmC_ModNACode) OR (RespData = opmC_ModErrorCode)) THEN opmG_ExchangeList[ExcCount].ResultString := '' ELSE opmG_ExchangeList[ExcCount].ResultString := RespData; END; END; QueryData := ''; UNTIL (RespType <> opmC_ModRet_Stat); opm_ProgressBar_Runmod.Position := ExcCount; END; opm_Runmod_Stat := opm_Runmod_Stat + #13#10 + opm_PRAskStatsMod; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} PROCEDURE Topm_Form_Runmod.AutoStart (VAR AutoStartMsg: TMessage); VAR IsConnected : BOOLEAN; ConnTries : LONGINT; StartupTime : DOUBLE; BEGIN IsConnected := FALSE; opm_Runmod_CanSync := TRUE; opm_Form_Runmod.Left := (opm_Form_Main.Left + 50); opm_Form_Runmod.Top := (opm_Form_Main.Top + 50); Application.ProcessMessages; opm_Label_RunmodStatus.Caption := _('Connecting to module...'); FOR ConnTries := 1 TO opmG_ModConnRetries DO BEGIN opm_Label_RunmodStatus.Caption := _('Connecting to module...') + ' ' + INTTOSTR (ConnTries) + '/' + INTTOSTR (opmG_ModConnRetries); StartupTime := GetTickCount; REPEAT Application.ProcessMessages; UNTIL (((GetTickCount - StartupTime) > opmG_ModConnWait) OR (GetTickCount < StartupTime)); IsConnected := opm_FNConnectMod (opmC_Localhost, opm_CurrentModuleRecord.Port); IF (IsConnected = TRUE) THEN BREAK; END; IF (IsConnected = TRUE) THEN BEGIN opm_Label_RunmodStatus.Caption := _('Exchanging with module...'); IF ((opm_CurrentModuleRecord.IndexData <> '') AND (opm_CurrentModuleRecord.ResultData <> '')) THEN IF (opm_FNFeedModule = TRUE) THEN BEGIN opm_Label_RunmodStatus.Caption := _('Disconnecting from module...'); opm_PRDisconnectMod; opm_Label_RunmodStatus.Caption := _('Done with the module.'); END ELSE BEGIN opm_Label_RunmodStatus.Caption := _('Module error!'); opm_PRDisconnectMod; opm_Runmod_CanSync := FALSE; END; END ELSE BEGIN opm_Label_RunmodStatus.Caption := _('Module error!'); opm_Runmod_CanSync := FALSE; END; opm_ProgressBar_Runmod.Visible := FALSE; opm_BitBtn_RunmodCancel.Enabled := TRUE; opm_BitBtn_RunmodCancel.Visible := TRUE; opm_Memo_RunmodDetails.Lines.Text := opm_Runmod_Stat; IF (opm_Runmod_CanSync = TRUE) THEN BEGIN opm_BitBtn_RunmodConfirm.Enabled := TRUE; opm_BitBtn_RunmodConfirm.Visible := TRUE; PRopm_CleanExchangeList (opmG_ExchangeList); PRopm_RenderConfirmDisplay (opmG_ExchangeList, opm_ListView_RunmodConfirm); opm_GroupBox_RunmodConfirm.Visible := TRUE; END; opm_Memo_RunmodDetails.Visible := TRUE; opm_Runmod_CanClose := TRUE; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} PROCEDURE Topm_Form_Runmod.PRopm_RenderConfirmDisplay (VAR SyncList : opmT_ExchangeList; VAR ListControl : TListView); VAR CurProd : LONGINT; CurItem : TListItem; BEGIN ListControl.Column[opm_Runmod_LastOrderColumn].ImageIndex := -1; opm_Runmod_Stat := ''; opm_Runmod_LastOrderColumn := 0; ListControl.Items.BeginUpdate; ListControl.Items.Clear; FOR CurProd := 0 TO (opmG_TotalExchangeItems - 1) DO BEGIN CurItem := ListControl.Items.Add; CASE SyncList[CurProd].Status OF opmC_SyncResult_Equal : CurItem.ImageIndex := 3; opmC_SyncResult_Diff : CurItem.ImageIndex := 4; opmC_SyncResult_Unknown : CurItem.ImageIndex := 5; opmC_SyncResult_Restricted : CurItem.ImageIndex := 1; END; CurItem.SubItems.Add (SyncList[CurProd].IndexString); CurItem.SubItems.Add (SyncList[CurProd].CurrentString); CurItem.SubItems.Add (SyncList[CurProd].ResultString); END; ListControl.Column[opm_Runmod_LastOrderColumn].ImageIndex := 9; ListControl.CustomSort (@FNopm_Sort_ExchangeList, opm_Runmod_LastOrderColumn); ListControl.Items.EndUpdate; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} PROCEDURE Topm_Form_Runmod.PRopm_CleanExchangeList (VAR SyncList : opmT_ExchangeList); VAR CurProd : LONGINT; BEGIN FOR CurProd := 0 TO (opmG_TotalExchangeItems - 1) DO BEGIN IF ((opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductQuantity) OR (opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductStatus)) THEN SyncList[CurProd].ResultString := FNopm_CleanNumber (SyncList[CurProd].ResultString, opmC_ValIsIntegerEmpty) ELSE IF ((opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductPrice) OR (opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductWeight)) THEN BEGIN SyncList[CurProd].CurrentString := FNopm_CleanNumber (SyncList[CurProd].CurrentString, opmC_ValIsCurrencyEmpty); SyncList[CurProd].ResultString := FNopm_CleanNumber (SyncList[CurProd].ResultString, opmC_ValIsCurrencyEmpty); END ELSE IF (opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductQuantity) THEN SyncList[CurProd].ResultString := FNopm_CleanString (SyncList[CurProd].ResultString); { Set status } IF (SyncList[CurProd].ResultString = '') THEN SyncList[CurProd].Status := opmC_SyncResult_Unknown ELSE IF (SyncList[CurProd].CurrentString = SyncList[CurProd].ResultString) THEN SyncList[CurProd].Status := opmC_SyncResult_Equal ELSE SyncList[CurProd].Status := opmC_SyncResult_Diff; IF (SyncList[CurProd].Status = opmC_SyncResult_Diff) THEN BEGIN IF ((opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductPrice) AND (STRTOCURRDEF (SyncList[CurProd].ResultString, 0) = 0) AND (opmG_UIAllowZeroPrice = 0)) THEN SyncList[CurProd].Status := opmC_SyncResult_Restricted ELSE IF ((opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductQuantity) AND (STRTOCURRDEF (SyncList[CurProd].ResultString, 0) < 0) AND (opmG_UIAllowNegativeQuantity = 0)) THEN SyncList[CurProd].Status := opmC_SyncResult_Restricted; END; END; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} PROCEDURE Topm_Form_Runmod.FormShow (Sender: TObject); BEGIN opm_Runmod_CanClose := FALSE; opm_Runmod_CanSync := FALSE; opm_BitBtn_RunmodCancel.Enabled := FALSE; opm_BitBtn_RunmodCancel.Visible := FALSE; opm_BitBtn_RunmodConfirm.Enabled := FALSE; opm_BitBtn_RunmodConfirm.Visible := FALSE; opm_Memo_RunmodDetails.Visible := FALSE; opm_GroupBox_RunmodConfirm.Visible := FALSE; opm_ProgressBar_Runmod.Visible := TRUE; opm_ProgressBar_Runmod.Position := 0; opm_Form_Runmod.Caption := _('Synchronization with external module'); opm_Runmod_LastOrderType := FALSE; opm_ListView_RunmodConfirm.Items.BeginUpdate; opm_ListView_RunmodConfirm.Items.Clear; opm_ListView_RunmodConfirm.Items.EndUpdate; opmG_TotalExchangeItems := opm_Form_Main.FNopm_Create_ExchangeList (opmG_ExchangeList, opm_CurrentModuleRecord.IndexData, opm_CurrentModuleRecord.ResultData); opm_Memo_RunmodDetails.Lines.Text := ''; PostMessage (Handle, OPM_AUTOSTARTMOD, 0, LONGINT (Sender)); END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} procedure Topm_Form_Runmod.FormClose (Sender: TObject; var Action: TCloseAction); begin IF (opm_Runmod_CanClose = FALSE) THEN Action := caNone ELSE BEGIN opm_ListView_RunmodConfirm.Items.BeginUpdate; opm_ListView_RunmodConfirm.Items.Clear; opm_ListView_RunmodConfirm.Items.EndUpdate; END; end; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} procedure Topm_Form_Runmod.FormCreate(Sender: TObject); begin opm_ListView_RunmodConfirm.Columns.Clear; opm_ListView_RunmodConfirm.Checkboxes := FALSE; opm_ListView_RunmodConfirm.ReadOnly := TRUE; opm_ListView_RunmodConfirm.DoubleBuffered := TRUE; opm_ListView_RunmodConfirm.ViewStyle := vsReport; opm_ListView_RunmodConfirm.Columns.Add; opm_ListView_RunmodConfirm.Columns.Add; opm_ListView_RunmodConfirm.Columns.Add; opm_ListView_RunmodConfirm.Columns.Add; opm_ListView_RunmodConfirm.Columns.Items[0].Caption := ''; opm_ListView_RunmodConfirm.Columns.Items[1].Caption := _('Index value'); opm_ListView_RunmodConfirm.Columns.Items[2].Caption := _('Old value'); opm_ListView_RunmodConfirm.Columns.Items[3].Caption := _('New value'); opm_ListView_RunmodConfirm.Columns.Items[1].Alignment := opmC_Def_Col20Align; opm_ListView_RunmodConfirm.Columns.Items[2].Alignment := opmC_Def_Col21Align; opm_ListView_RunmodConfirm.Columns.Items[3].Alignment := opmC_Def_Col22Align; IF (opmG_UIHotTracking > 0) THEN BEGIN opm_ListView_RunmodConfirm.HotTrack := FALSE; opm_ListView_RunmodConfirm.HotTrackStyles := [htHandPoint, htUnderlineHot]; END ELSE BEGIN opm_ListView_RunmodConfirm.HotTrack := FALSE; opm_ListView_RunmodConfirm.HotTrackStyles := []; END; IF (opmG_UIRememberDisplay > 0) THEN BEGIN opm_ListView_RunmodConfirm.Column[0].Width := opmG_UICol0X; opm_ListView_RunmodConfirm.Column[1].Width := opmG_UICol20X; opm_ListView_RunmodConfirm.Column[2].Width := opmG_UICol21X; opm_ListView_RunmodConfirm.Column[3].Width := opmG_UICol22X; END ELSE BEGIN opm_ListView_RunmodConfirm.Column[0].Width := opmC_Def_Col0X; opm_ListView_RunmodConfirm.Column[1].Width := opmC_Def_Col20X; opm_ListView_RunmodConfirm.Column[2].Width := opmC_Def_Col21X; opm_ListView_RunmodConfirm.Column[3].Width := opmC_Def_Col22X; END; TranslateComponent (self); end; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} procedure Topm_Form_Runmod.opm_BitBtn_RunmodConfirmClick(Sender: TObject); VAR ExcCount : LONGINT; USyncSQL, WSyncSQL : STRING; begin IF (opm_Runmod_CanSync = TRUE) THEN BEGIN opm_Label_RunmodStatus.Caption := _('Updating products database...'); opm_BitBtn_RunmodCancel.Enabled := FALSE; opm_BitBtn_RunmodCancel.Visible := FALSE; opm_BitBtn_RunmodConfirm.Enabled := FALSE; opm_BitBtn_RunmodConfirm.Visible := FALSE; opm_Memo_RunmodDetails.Visible := FALSE; opm_GroupBox_RunmodConfirm.Visible := FALSE; opm_ProgressBar_Runmod.Visible := TRUE; opm_ProgressBar_Runmod.Min := 0; opm_ProgressBar_Runmod.Max := (opmG_TotalExchangeItems - 1); opm_ProgressBar_Runmod.Step := ROUND (opmG_TotalExchangeItems / 20); opm_ProgressBar_Runmod.Position := 0; FOR ExcCount := 0 TO (opmG_TotalExchangeItems - 1) DO BEGIN IF (opmG_ExchangeList[ExcCount].Status = opmC_SyncResult_Diff) THEN BEGIN IF ((opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductQuantity) OR (opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductPrice) OR (opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductWeight) OR (opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductStatus)) THEN USyncSQL := 'update ' + opmG_DBTable_Products + ' set ' + opm_CurrentModuleRecord.ResultData + '=' + opmG_ExchangeList[ExcCount].ResultString ELSE IF (opm_CurrentModuleRecord.ResultData = opmC_SyncField_ProductQuantity) THEN USyncSQL := 'update ' + opmG_DBTable_Products + ' set ' + opm_CurrentModuleRecord.ResultData + '="' + opmG_ExchangeList[ExcCount].ResultString + '"' ELSE USyncSQL := ''; IF (opm_CurrentModuleRecord.IndexData = opmC_SyncField_ProductID) THEN WSyncSQL := 'where ' + opmC_SyncField_ProductID + '=' + opmG_ExchangeList[ExcCount].IndexString ELSE IF (opm_CurrentModuleRecord.IndexData = opmC_SyncField_ProductModel) THEN WSyncSQL := 'where ' + opmC_SyncField_ProductModel + '="' + opmG_ExchangeList[ExcCount].IndexString + '"' ELSE WSyncSQL := ''; END; IF ((USyncSQL <> '') AND (WSyncSQL <> '')) THEN FNopm_WebDB_Query (opmG_WBUploadURL, USyncSQL + ' ' + WSyncSQL, opmG_DBQuery_Recordset); opm_ProgressBar_Runmod.Position := ExcCount; END; opm_Label_RunmodStatus.Caption := _('Done updating database.'); opm_Runmod_CanClose := TRUE; opm_Form_Runmod.ModalResult := mrAll; END; end; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} PROCEDURE Topm_Form_Runmod.opm_PopMenuItem_RunmodCopyClick (Sender: TObject); VAR ExportText : STRING; BEGIN PRopm_Create_ConfirmExportList (ExportText, opmG_ExchangeList, opmC_SyncResult_Any); Clipboard.AsText := ExportText; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} procedure Topm_Form_Runmod.opm_PopMenuItem_RunmodCopyDiffClick(Sender: TObject); VAR ExportText : STRING; BEGIN PRopm_Create_ConfirmExportList (ExportText, opmG_ExchangeList, opmC_SyncResult_Diff); Clipboard.AsText := ExportText; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} procedure Topm_Form_Runmod.opm_PopMenuItem_RunmodCopyEqualClick(Sender: TObject); VAR ExportText : STRING; BEGIN PRopm_Create_ConfirmExportList (ExportText, opmG_ExchangeList, opmC_SyncResult_Equal); Clipboard.AsText := ExportText; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} procedure Topm_Form_Runmod.opm_PopMenuItem_RunmodCopyUnknownClick(Sender: TObject); VAR ExportText : STRING; BEGIN PRopm_Create_ConfirmExportList (ExportText, opmG_ExchangeList, opmC_SyncResult_Unknown); Clipboard.AsText := ExportText; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} procedure Topm_Form_Runmod.opm_PopMenuItem_RunmodCopyRestrictedClick(Sender: TObject); VAR ExportText : STRING; BEGIN PRopm_Create_ConfirmExportList (ExportText, opmG_ExchangeList, opmC_SyncResult_Restricted); Clipboard.AsText := ExportText; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} PROCEDURE Topm_Form_Runmod.PRopm_Create_ConfirmExportList (VAR ExportString : STRING; VAR ExportList : opmT_ExchangeList; SelectType : LONGINT); VAR ExportLine : STRING; CurProd : LONGINT; BEGIN ExportString := ''; ExportLine := ''; FOR CurProd := 0 TO (opmG_TotalExchangeItems - 1) DO BEGIN IF (ExportList[CurProd].Status = opmC_SyncResult_Unknown) THEN BEGIN IF ((SelectType = opmC_SyncResult_Any) OR (SelectType = opmC_SyncResult_Unknown)) THEN BEGIN ExportLine := ExportLine + ExportList[CurProd].IndexString + opmC_ExportSeparator; ExportLine := ExportLine + _('Unknown sync product') + opmC_ExportSeparator; ExportLine := ExportLine + ExportList[CurProd].CurrentString + opmC_ExportSeparator + ExportList[CurProd].ResultString; END; END ELSE IF (ExportList[CurProd].Status = opmC_SyncResult_Equal) THEN BEGIN IF ((SelectType = opmC_SyncResult_Any) OR (SelectType = opmC_SyncResult_Equal)) THEN BEGIN ExportLine := ExportLine + ExportList[CurProd].IndexString + opmC_ExportSeparator; ExportLine := ExportLine + _('Unchanged sync product') + opmC_ExportSeparator; ExportLine := ExportLine + ExportList[CurProd].CurrentString + opmC_ExportSeparator + ExportList[CurProd].ResultString; END; END ELSE IF (ExportList[CurProd].Status = opmC_SyncResult_Diff) THEN BEGIN IF ((SelectType = opmC_SyncResult_Any) OR (SelectType = opmC_SyncResult_Diff)) THEN BEGIN ExportLine := ExportLine + ExportList[CurProd].IndexString + opmC_ExportSeparator; ExportLine := ExportLine + _('Different sync product') + opmC_ExportSeparator; ExportLine := ExportLine + ExportList[CurProd].CurrentString + opmC_ExportSeparator + ExportList[CurProd].ResultString; END; END ELSE IF (ExportList[CurProd].Status = opmC_SyncResult_Restricted) THEN BEGIN IF ((SelectType = opmC_SyncResult_Any) OR (SelectType = opmC_SyncResult_Restricted)) THEN BEGIN ExportLine := ExportLine + ExportList[CurProd].IndexString + opmC_ExportSeparator; ExportLine := ExportLine + _('Invalid sync product') + opmC_ExportSeparator; ExportLine := ExportLine + ExportList[CurProd].CurrentString + opmC_ExportSeparator + ExportList[CurProd].ResultString; END; END; IF (ExportLine <> '') THEN ExportString := ExportString + ExportLine + #13#10; ExportLine := ''; END; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} FUNCTION FNopm_Sort_ExchangeList (Item1, Item2: TListItem; Column: INTEGER) : INTEGER; STDCALL; BEGIN CASE Column OF 2, 3 : IF (opm_Runmod_LastOrderType = FALSE) THEN FNopm_Sort_ExchangeList := ROUND ((STRTOCURRDEF (Item1.SubItems[Column - 1], 0) - STRTOCURRDEF (Item2.SubItems[Column - 1], 0))) ELSE FNopm_Sort_ExchangeList := ROUND ((STRTOCURRDEF (Item1.SubItems[Column - 1], 0) - STRTOCURRDEF (Item2.SubItems[Column - 1], 0)) * -1); 0 : IF (opm_Runmod_LastOrderType = FALSE) THEN FNopm_Sort_ExchangeList := ROUND ((Item1.ImageIndex - Item2.ImageIndex)) ELSE FNopm_Sort_ExchangeList := ROUND ((Item1.ImageIndex - Item2.ImageIndex) * -1); ELSE IF (opm_Runmod_LastOrderType = FALSE) THEN FNopm_Sort_ExchangeList := AnsiCompareText (Item1.SubItems[Column - 1], Item2.SubItems[Column - 1]) ELSE FNopm_Sort_ExchangeList := ((AnsiCompareText (Item1.SubItems[Column - 1], Item2.SubItems[Column - 1])) * -1); END; END; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} procedure Topm_Form_Runmod.opm_ListView_RunmodConfirmColumnClick (Sender: TObject; Column: TListColumn); begin IF (Column.Index >= 0) AND (Column.Index <= 3) THEN BEGIN opm_ListView_RunmodConfirm.Column[opm_Runmod_LastOrderColumn].ImageIndex := -1; IF (opm_Runmod_LastOrderColumn = Column.Index) THEN opm_Runmod_LastOrderType := NOT (opm_Runmod_LastOrderType) ELSE opm_Runmod_LastOrderType := FALSE; IF (opm_Runmod_LastOrderType = TRUE) THEN Column.ImageIndex := 8 ELSE Column.ImageIndex := 9; opm_Runmod_LastOrderColumn := Column.Index; TListView (Sender).CustomSort (@FNopm_Sort_ExchangeList, Column.Index); END; end; {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} {%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%} procedure Topm_Form_Runmod.opm_ListView_RunmodConfirmCustomDrawItem (Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin IF ((opmG_UIStripes > 0) AND ODD (Item.Index)) THEN opm_ListView_RunmodConfirm.Canvas.Brush.Color := opmG_StripeColor ELSE opm_ListView_RunmodConfirm.Canvas.Brush.Color := clWindow; end; end.