Tuesday, January 16, 2024

c# - How to use LINQ aggregate() function

This calling performs SUM on Population (with starting value = 0.)
    
public List<Country> Countries = new();
...
this.Countries.Add( new Country( "Czech", Country.ContinentEnum.EUROPE, 10 ) );
this.Countries.Add( new Country( "Poland", Country.ContinentEnum.EUROPE, 40 ) );
this.Countries.Add( new Country( "China", Country.ContinentEnum.ASIA, 1100 ) );
this.Countries.Add( new Country( "USA", Country.ContinentEnum.AMERICA, 340 ) );
...
int total = this.Countries.Aggregate( 0, (total,b) => total + b.Population );

MessageBox.Show( total.ToString() );  // -> 1490

Thursday, November 30, 2023

c# - How to call custom event

1) Custom event without parameters:
public Action OnBeforeEvaluationEvent;
...
if ( OnBeforeEvaluationEvent != null ) OnBeforeEvaluationEvent();
2) Custom event with parameter(s):
public delegate void OnAfterEvaluatingDelegate( CodeConditionGroup _conditionGroup );    
public event OnAfterEvaluatingDelegate OnAfterEvaluationgEvent;

if ( OnAfterEvaluationgEvent != null ) OnAfterEvaluationgEvent( condition );

Friday, November 24, 2023

c#, devexpress - How to make master-detail relation on non-DB objects (List generic )

List<TmpParent> list = new List<TmpParent>();

List<TmpChild> listChildExternal = new List<TmpChild>();
Initial data filling:
var p = new TmpParent( "A", "A", true );
p.listInner.Add( new TmpChild() );
list.Add( p );
list.Add( new TmpParent( "B", "B", false, TypeEnum.OPERATOR ) );
list.Add( new TmpParent( "C", "C", true ) );
list.Add( new TmpParent( "D", "D", false ) );

listChildExternal.Add( new TmpChild() { str1="C", str2 = "child1" } );
listChildExternal.Add( new TmpChild() { str1="C", str2 = "child1.1" } );
listChildExternal.Add( new TmpChild() { str1="B", str2 = "child1.2" } );

gridParent.DataSource = list;	// master
Find and show detail data:
  • First detail list for inner list.
  • Second detail list for external list connected with relation.
private void gridViewParent_FocusedRowChanged( object sender, 
  DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e ) {
   
  if ( e.FocusedRowHandle >= 0 ) {        
    TmpParent master = gridView1.GetRow( e.FocusedRowHandle ) as TmpParent;
    if ( master != null ) {          
      /* A] try to find in inner list */
      gridDetail.DataSource = master.listInner;

      /* B] try to find in external list */           
      gridChildExternal.DataSource = 
        listChildExternal.Where( x => x.str1 == master.str1 ).ToList();
    }
  }
}
First grid=master, second grid=detail internal list, third grid=detail external list.

Tuesday, November 14, 2023

c#, devexpress - How to use attributes in GridControl (devexpress)

The attributes in the class can be used as metadata for generated GridControl (devexpress) columns. 

Class for rows:
public enum TypeEnum {
   [Display(Name = "Type is expression.")]  
   EXPRESSION = 0,
   [Display(Name = "Type is operator.")]  
   OPERATOR = 1
}    

public class TmpParent
{            
   [Display(
     ShortName = "Company", 
     Name = "Company Name", 
     Description = "The amount of currently available product", 
     AutoGenerateFilter = false)
   ]
  public string str1 { get; set; }
  [DataType(DataType.Text), StringLength(20, MinimumLength = 3)]
  public string str2 { get; set; }
  public bool bool1 { get; set; }
  public TypeEnum enum1 { get; set; }
  [DisplayFormat(DataFormatString = "MMMM/yyyy")]
  public DateTime date1 { get; set; }
  [DisplayFormat(DataFormatString = "p", ApplyFormatInEditMode = true)]
  public float value1 {  get; set; }
  [DataType(DataType.Currency), Range(200, 5000), Required]    
  public float value2 { get; set; }
        
   public TmpParent( string _s1, string _s2, bool _b, TypeEnum _enum = TypeEnum.EXPRESSION )
   {
     str1 = _s1;
     str2 = _s2;
     bool1 = _b;
     enum1 = _enum;
     date1 = DateTime.Now;
     value1 = 100.1f;
     value2 = 300.5f;
   }
}
Grid fillings:
var p = new TmpParent( "A", "A", true );
list.Add( p );
list.Add( new TmpParent( "B", "B", false, TypeEnum.OPERATOR ) );
list.Add( new TmpParent( "C", "C", true ) );
list.Add( new TmpParent( "D", "D", false ) );

gridParent.DataSource = list;
Output:

Monday, October 23, 2023

delphi - How to work with generic TArray

Using generic TArray with String type.
procedure TFDrawingRelease.doReading;
var
  f : TextFile;
  sRow : string;
  aSplitted: TArray<string>;
begin
  { -- delete all rows }

  if QData.Active then
    begin
      QData.Close;
      QData.Open;
    end;

  { -- open file and read data (two columns divided by ";") }

  AssignFile( f, EFileName.Text );
  try
    Screen.Cursor := crHourGlass;
    QData.DisableControls;

    reset( f );  
    
    while not eof( f ) do
      begin
        readln( f, sRow );

        aSplitted := sRow.Split( [';'], 2 );

        QData.Insert;
        { ..and return to first char _ }
        QDataItemid.AsString := aSplitted[0].Split( [ '_' ], 1 )[0];
        QDataName.AsString := aSplitted[1];
        QData.Post;
      end;
  finally
    closeFile( f );

    QData.EnableControls;
    Screen.Cursor := crDefault;
  end;

  SetButtons;
end;

Wednesday, September 6, 2023

ax - How to call new form and modify its grid filter

Args    args;
FormRun formRun;
Query query;
My_VM_Resources table;
FormDataSource formDataSource = new FormDataSource();

super();

// call the new form 
args = new Args();
formRun = new menufunction( menuItemDisplayStr( WrkCtrCapRes ), 
                            MenuItemType::Display ).create( args );

formRun.init();
formDataSource = formRun.dataSource();
formRun.run();

table = My_VM_Resources_ds.cursor();
formDataSource.filter( fieldNum(WrkCtrCapRes, WrkCtrId), /*"5210*"*/table.my_resource_mask );
formRun.detach();

formRun.wait();

Wednesday, July 12, 2023

Monday, May 22, 2023

oracle - How to alter sequence next number

DROP SEQUENCE MENU_SEQ;

create sequence MENU_SEQ
minvalue 1
maxvalue 999999999999999999999
start with 18456
increment by 1
cache 20;

Friday, April 21, 2023

ax - How to find plan version by name

if ( this.RefType == WrkCtrCapRefType::PlannedOrder ) {
        
  reqPO = ReqPO::find( 
    ReqPlanVersion::findReqPlanId( "MAIN", "company", NoYes::Yes, false ).RecId,  
    this.refId, false );
        
  if ( reqPO ) return reqPO.ItemId;
}

Friday, April 14, 2023

c# - How to solve problem on TEST project with error on referenced project

The problem with the referenced project error can be solved with this change: 

 Set "Target OS" from "None" to something else.

Monday, January 30, 2023

c# - How to save List into text file

public List CodeLogOnlyList = new();
...
await System.IO.File.WriteAllLinesAsync( _filename, this.CodeLogOnlyList );

Friday, January 20, 2023

Wednesday, January 11, 2023

Thursday, November 17, 2022

sql server - How to count only rows where are non-zero value

In SELECT use this construction with CASE statement:
...
count(*) as rowscount,

sum( case a.costamount when 0 then 0 else 1 end ) as rowscount_nonzero

Friday, July 22, 2022

c# - How convert string array into one string

If you use this code on string array:
string[] args = Environment.GetCommandLineArgs();      
Console.Write( args.ToString() );
you will get:
System.String[]
But better way in this case is to use string.Join() function (where you can set used delimiter):
string[] args = Environment.GetCommandLineArgs();      
Console.Write( string.Join( ",", args ) );
Then:
C:\app.dll,layoutdir=C:/app/bin

Friday, June 24, 2022

c# - How get important system informations

Sometimes you need for example width of the standard scrollbar. For getting it you can use SystemInformation class (WinForms). Here is a list of supported properties and their values.
Type t = typeof( System.Windows.Forms.SystemInformation );            
PropertyInfo[] property = t.GetProperties();

for( int i = 0; i < property.Length; i++ )
  richTextBox1.Text += property[ i ].Name + " = " + 
  property[ i ].GetValue( null, null ).ToString() + "\n";        
Output:
DragFullWindows = True
HighContrast = False
MouseWheelScrollLines = 3
PrimaryMonitorSize = {Width=1920, Height=1080}
VerticalScrollBarWidth = 17
HorizontalScrollBarHeight = 17
CaptionHeight = 23
BorderSize = {Width=1, Height=1}
FixedFrameBorderSize = {Width=3, Height=3}
VerticalScrollBarThumbHeight = 17
HorizontalScrollBarThumbWidth = 17
IconSize = {Width=32, Height=32}
CursorSize = {Width=32, Height=32}
MenuFont = [Font: Name=Segoe UI, Size=12, Units=0, GdiCharSet=1, GdiVerticalFont=False]
MenuHeight = 20
PowerStatus = System.Windows.Forms.PowerStatus
WorkingArea = {X=0,Y=0,Width=1920,Height=1080}
KanjiWindowHeight = 0
MousePresent = True
VerticalScrollBarArrowHeight = 17
HorizontalScrollBarArrowWidth = 17
DebugOS = False
MouseButtonsSwapped = False
MinimumWindowSize = {Width=136, Height=39}
CaptionButtonSize = {Width=36, Height=22}
FrameBorderSize = {Width=4, Height=4}
MinWindowTrackSize = {Width=136, Height=39}
DoubleClickSize = {Width=4, Height=4}
DoubleClickTime = 500
IconSpacingSize = {Width=75, Height=75}
RightAlignedMenus = False
PenWindows = False
DbcsEnabled = False
MouseButtons = 8
Secure = False
Border3DSize = {Width=2, Height=2}
MinimizedWindowSpacingSize = {Width=160, Height=28}
SmallIconSize = {Width=16, Height=16}
ToolWindowCaptionHeight = 23
ToolWindowCaptionButtonSize = {Width=22, Height=22}
MenuButtonSize = {Width=19, Height=19}
ArrangeStartingPosition = Hide
ArrangeDirection = Left
MinimizedWindowSize = {Width=160, Height=28}
MaxWindowTrackSize = {Width=1940, Height=1100}
PrimaryMonitorMaximizedWindowSize = {Width=1936, Height=1096}
Network = True
TerminalServerSession = False
BootMode = Normal
DragSize = {Width=4, Height=4}
ShowSounds = False
MenuCheckSize = {Width=15, Height=15}
MidEastEnabled = False
NativeMouseWheelSupport = True
MouseWheelPresent = True
VirtualScreen = {X=0,Y=0,Width=1920,Height=1080}
MonitorCount = 1
MonitorsSameDisplayFormat = True
ComputerName = WZ1G89XBX
UserDomainName = LYZ
UserInteractive = True
UserName = pirklj
IsDropShadowEnabled = True
IsFlatMenuEnabled = True
IsFontSmoothingEnabled = True
FontSmoothingContrast = 1200
FontSmoothingType = 2
IconHorizontalSpacing = 75
IconVerticalSpacing = 75
IsIconTitleWrappingEnabled = True
MenuAccessKeysUnderlined = False
KeyboardDelay = 1
IsKeyboardPreferred = False
KeyboardSpeed = 31
MouseHoverSize = {Width=4, Height=4}
MouseHoverTime = 400
MouseSpeed = 10
IsSnapToDefaultEnabled = False
PopupMenuAlignment = Right
IsMenuFadeEnabled = True
MenuShowDelay = 400
IsComboBoxAnimationEnabled = True
IsTitleBarGradientEnabled = True
IsHotTrackingEnabled = True
IsListBoxSmoothScrollingEnabled = True
IsMenuAnimationEnabled = True
IsSelectionFadeEnabled = True
IsToolTipAnimationEnabled = True
UIEffectsEnabled = True
IsActiveWindowTrackingEnabled = False
ActiveWindowTrackingDelay = 0
IsMinimizeRestoreAnimationEnabled = False
BorderMultiplierFactor = 1
CaretBlinkTime = 530
CaretWidth = 1
MouseWheelScrollDelta = 120
VerticalFocusThickness = 1
HorizontalFocusThickness = 1
VerticalResizeBorderThickness = 4
HorizontalResizeBorderThickness = 4
ScreenOrientation = Angle0
SizingBorderWidth = 1
SmallCaptionButtonSize = {Width=22, Height=22}
MenuBarButtonSize = {Width=19, Height=19}

Thursday, June 9, 2022

c# - How to format interpolated strings

This example writes double value with two decimal places.
double zoom = this.ZoomFactor * 100.0;
LStatusZoom.Text = $"Zoom: {zoom:0.##} %";
Output:
Zoom: 80.25 %

Monday, June 6, 2022

win os - How to copy all files defined by mask in all subdirectories into one directory

Copy all *.mobi files in current directory and all subdirectories into c:\temp\mobi directory. 
The destination directory must exists.
find . -name \*.mobi -exec cp {} c:/temp/mobi/ \;
UPDATE: Better variant:
for /r %i in (*.epub) do xcopy /Y "%i" c:\temp\mobi

Tuesday, May 10, 2022

c# - How to make DOWN button (in group of buttons)

The goal: Only one button from group can be down.
Every button link through Click event to this method:
private void downclick( object sender, EventArgs e ) {
  Button b = (Button)sender;

  /* if is down -> do nothing */
  if ( b.BackColor == Color.IndianRed ) return;

  /* set as down */
  b.BackColor = Color.IndianRed;

  /* deselect others */
  b.Parent.Controls
    .Cast<Control>()
    .Where( x => x is Button )
    .Cast<Button>()
    .Where( x => x != b )
    .ToList()
    .ForEach( x => x.BackColor = Color.WhiteSmoke );
}
So - pushed button = Color.IndianRed. If you want to know which button is down pushed:
  /* get down button */
  Button b = groupBox1.Controls
    .Cast<Control>()
    .Where( x => x is Button )
    .Cast<Button>()
    .Where( x => x.BackColor == Color.IndianRed )
    .ToList()
    .FirstOrDefault();
        
  MessageBox.Show( b.Text );
}

Tuesday, April 19, 2022

c# - How to create instance with string class name

String variable sClass contains for example Box.LayoutItem string. ParentObject and ParentID are optional constructor parameters.
var p = Activator.CreateInstance( Type.GetType( sClass ), parentObject, parentID );
LayoutItem p1 = (LayoutItem)p;
p1.Load( x );

Tuesday, March 29, 2022

c# - How to solve error "Sequence contains no elements" by Max() LINQ

This error occurs when the list is empty - no items are suitable for conditions.
int xCalc = _layoutManager.Items
  .Where( x=> x.ParentObject == this.ParentObject )
  .Where( x=> x.LayoutRelativePosition == LayoutRelativePositionEnum.RIGHT )
  .Where( x=> x.IDOrder < this.IDOrder )              
  .Max( x=> x.xCalc + x.heightCalc );
Above Max() version returns in that situation (no items) error "Sequence contains no elements". For solution you can use this format of the Max() function:
int xCalc = _layoutManager.Items
  .Where( x=> x.ParentObject == this.ParentObject )
  .Where( x=> x.LayoutRelativePosition == LayoutRelativePositionEnum.RIGHT )
  .Where( x=> x.IDOrder < this.IDOrder )
  .Select(x => x.xCalc + x.heightCalc )
  .DefaultIfEmpty()          
  .Max();