|
You need to dig deeper into the Media Player or "Media Element" class. There's a "Media Timeline" class (and "Storyboard" class) that seem to have some bearing on what you're doing.
You may have to "chunk" your way through the media source with multiple time lines of starting position and duration (if there's no appropriate events to capture or you're not into WPF).
How to: Control a MediaElement by Using a Storyboard - WPF | Microsoft Docs
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
I read this source code then I built my form to draw a rectangle and make it able to resize/ move it, some how, the logic I follow is wrong, because the mouse when it moves up the small rectangles then the mouse cursor should change, it is some times change and others not, even in the console I can see the mouse cursor should apply. Also if I try to resize it then a new rectangle drawn. My form source code:
public partial class Form2 : Form
{
private enum ResizableRect
{
RightUp,
RightMiddle,
RightBottom,
LeftUp,
LeftMiddle,
LeftBottom,
UpMiddle,
BottomMiddle,
None
};
private int m_resizableRectSize = 6;
private ResizableRect m_resizableRectNodeSelected = ResizableRect.None;
Rectangle rect;
Point StartXY;
Point EndXY;
int x = 0;
int y = 0;
bool m_isMouseDown = false;
bool m_movingRect = false;
public Form2()
{
InitializeComponent();
this.DoubleBuffered = true;
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
{
Graphics gObj = panel1.CreateGraphics();
Pen rectPen = new Pen(Color.Red, 2);
rectPen.DashStyle = DashStyle.Dash;
x = Math.Min(StartXY.X, EndXY.X);
y = Math.Min(StartXY.Y, EndXY.Y);
int height = Math.Abs(StartXY.X - EndXY.X);
int width = Math.Abs(StartXY.Y - EndXY.Y);
rect = new Rectangle(x, y, height, width);
gObj.DrawRectangle(rectPen, rect);
foreach (ResizableRect pos in Enum.GetValues(typeof(ResizableRect)))
{
gObj.DrawRectangle(new Pen(Color.Red), GetResizableRectNode(pos));
}
}
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
m_resizableRectNodeSelected = GetNodeSelectable(e.Location);
StartXY = e.Location;
m_isMouseDown = true;
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
this.Cursor = GetResizableRectCursorType(GetNodeSelectable(e.Location));
if (rect.Contains(new Point(e.X, e.Y)))
{
this.Cursor = Cursors.SizeAll;
}
else
{
switch (m_resizableRectNodeSelected)
{
case ResizableRect.LeftUp:
rect.X += e.X - EndXY.X;
rect.Width -= e.X - EndXY.X;
rect.Y += e.Y - EndXY.Y;
rect.Height -= e.Y - EndXY.Y;
break;
case ResizableRect.LeftMiddle:
rect.X += e.X - EndXY.X;
rect.Width -= e.X - EndXY.X;
break;
case ResizableRect.LeftBottom:
rect.Width -= e.X - EndXY.X;
rect.X += e.X - EndXY.X;
rect.Height += e.Y - EndXY.Y;
break;
case ResizableRect.BottomMiddle:
rect.Height += e.Y - EndXY.Y;
break;
case ResizableRect.RightUp:
rect.Width += e.X - EndXY.X;
rect.Y += e.Y - EndXY.Y;
rect.Height -= e.Y - EndXY.Y;
break;
case ResizableRect.RightBottom:
rect.Width += e.X - EndXY.X;
rect.Height += e.Y - EndXY.Y;
break;
case ResizableRect.RightMiddle:
rect.Width += e.X - EndXY.X;
break;
case ResizableRect.UpMiddle:
rect.Y += e.Y - EndXY.Y;
rect.Height -= e.Y - EndXY.Y;
break;
default:
if (m_isMouseDown)
{
rect.X = rect.X + e.X - EndXY.X;
rect.Y = rect.Y + e.Y - EndXY.Y;
}
break;
}
}
if (m_isMouseDown)
{
EndXY = e.Location;
panel1.Invalidate();
}
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
EndXY = e.Location;
m_isMouseDown = false;
m_movingRect = false;
Invalidate();
}
private Rectangle DrawResizableRectNode(int x, int y)
{
return new Rectangle(x - m_resizableRectSize / 2, y - m_resizableRectSize / 2, m_resizableRectSize, m_resizableRectSize);
}
private ResizableRect GetNodeSelectable(Point p)
{
foreach (ResizableRect r in Enum.GetValues(typeof(ResizableRect)))
{
if (GetResizableRectNode(r).Contains(p))
{
Console.WriteLine("GetNodeSelectable: " + r.ToString());
return r;
}
}
return ResizableRect.None;
}
private Rectangle GetResizableRectNode(ResizableRect p)
{
switch (p)
{
case ResizableRect.LeftUp:
return DrawResizableRectNode(rect.X, rect.Y);
case ResizableRect.LeftMiddle:
return DrawResizableRectNode(rect.X, rect.Y + rect.Height / 2);
case ResizableRect.LeftBottom:
return DrawResizableRectNode(rect.X, rect.Y + rect.Height);
case ResizableRect.BottomMiddle:
return DrawResizableRectNode(rect.X + rect.Width / 2, rect.Y + rect.Height);
case ResizableRect.RightUp:
return DrawResizableRectNode(rect.X + rect.Width, rect.Y);
case ResizableRect.RightBottom:
return DrawResizableRectNode(rect.X + rect.Width, rect.Y + rect.Height);
case ResizableRect.RightMiddle:
return DrawResizableRectNode(rect.X + rect.Width, rect.Y + rect.Height / 2);
case ResizableRect.UpMiddle:
return DrawResizableRectNode(rect.X + rect.Width / 2, rect.Y);
default:
return new Rectangle();
}
}
private Cursor GetResizableRectCursorType(ResizableRect resizableRectPoint)
{
Cursor rectPositionCursor;
switch (resizableRectPoint)
{
case ResizableRect.LeftUp:
rectPositionCursor = Cursors.SizeNWSE;
break;
case ResizableRect.LeftMiddle:
rectPositionCursor = Cursors.SizeWE;
break;
case ResizableRect.LeftBottom:
rectPositionCursor = Cursors.SizeNESW;
break;
case ResizableRect.BottomMiddle:
rectPositionCursor = Cursors.SizeNS;
break;
case ResizableRect.RightUp:
rectPositionCursor = Cursors.SizeNESW;
break;
case ResizableRect.RightBottom:
rectPositionCursor = Cursors.SizeNWSE;
break;
case ResizableRect.RightMiddle:
rectPositionCursor = Cursors.SizeWE;
break;
case ResizableRect.UpMiddle:
rectPositionCursor = Cursors.SizeNS;
break;
default:
rectPositionCursor = Cursors.Default;
break;
}
Console.WriteLine("GetResizableRectCursorType: " + rectPositionCursor.ToString());
return rectPositionCursor;
}
}
|
|
|
|
|
Hi,
unfortunately your code already contains a lot of details, making it hard to pinpoint what exactly is the problem. IMHO one should always work on smaller pieces and get them to run satisfactorily before adding to them.
So I will limit my reply to a number of comments, which taken together really indicate I'm not so happy with the current code:
1.
It seems you want a hovering mouse to show what would happen if the mouse were clicked in its current position; that should consist of:
- deciding which if any rectangle is hovered over;
- deciding how it is hit (i.e. in the size handles or in the body).
As size handles overlap the actual rectangle, one must be careful in what order the Contains() logic is applied. I would probably use a slightly larger rectangle and check that first, assuming a move is intended, and on a hit then check whether any of the size handles is hit (which would overrule the move).
2.
Once the mouse goes down, the decision (from #1) should be frozen, and data should be set up to initiate the actual move/resize.
3.
Back in the mouse move handler, the actual action should happen until mouse up is reached.
4.
As a consequence:
- the MouseMove handler should have two completely distinct halves, one for the decision process (mouse still up), one for the execution (mouse down); a single bool (set/cleared by MouseDown/MouseUp) would decide between the halves.
- the MouseDown handler shouldn't do much at all.
5.
If I were creating something like this, I would start from scratch, and initially keep it as simple as possible.
I would also choose variable and method names carefully, e.g. DrawResizableRectNode isn't OK as it does not draw at all.
Added later, two smaller issues I forgot to mention:
6.
There is no need to create a Graphics object explicitly; you get it for free as one of the properties of the PaintEventArgs in a Paint handler.
7.
You should keep Paint handlers as lean as possible, in particular you should create the drawing objects (Pens, Fonts, ...) you need only once, and save them in class level variables for reuse. In your case, that applies to rectPen.
And if you fail to keep them around, it is your duty to dispose of them (by calling their Dispose method or applying a using statement), in order to avoid Windows problems such as handle shortages.
Hope this helps,
modified 27-Apr-20 20:15pm.
|
|
|
|
|
Hi,
Your notes are helpful to help where to look in my code, but still I can't get it work
I started from scratch and made the first step is just to move the rectangle, my issue now is to calculate the new starting XY, but it seems resize the rectangle when mouseUp:
<pre>private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (rect.Contains(e.Location))
this.Cursor = Cursors.SizeAll;
else
this.Cursor = Cursors.Default;
if (m_mouseDown && rect.Contains(e.Location))
{
if (e.X > StartXY.X)
{
EndXY.X += e.X - StartXY.X;
EndXY.Y += e.Y - StartXY.Y;
}
else
{
EndXY.X += Math.Abs(e.X - StartXY.X);
EndXY.Y += Math.Abs(e.Y - StartXY.Y);
}
StartXY = e.Location;
Console.WriteLine("pictureBox1_MouseMove");
}
if (m_mouseDown && !rect.Contains(e.Location))
{
EndXY = e.Location;
}
Invalidate();
}
Complete code:
public partial class Form1 : Form
{
Rectangle rect;
Point StartXY;
Point EndXY;
int x = 0;
int y = 0;
int height = 0;
int width = 0;
bool m_mouseDown = false;
bool m_movingRect = false;
Pen rectPen = new Pen(Color.Red, 1);
public Form1()
{
InitializeComponent();
this.DoubleBuffered = true;
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics gObj = e.Graphics;
x = Math.Min(StartXY.X, EndXY.X);
y = Math.Min(StartXY.Y, EndXY.Y);
height = Math.Abs(StartXY.X - EndXY.X);
width = Math.Abs(StartXY.Y - EndXY.Y);
rect = new Rectangle(x, y, height, width);
rectPen.DashStyle = DashStyle.Dash;
gObj.DrawRectangle(rectPen, rect);
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
m_mouseDown = true;
if (rect.Contains(e.Location))
{
m_movingRect = true;
Console.WriteLine("m_mouseDown");
}
else
{
StartXY = e.Location;
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (rect.Contains(e.Location))
this.Cursor = Cursors.SizeAll;
else
this.Cursor = Cursors.Default;
if (m_mouseDown && rect.Contains(e.Location))
{
if (e.X > StartXY.X)
{
EndXY.X += e.X - StartXY.X;
EndXY.Y += e.Y - StartXY.Y;
}
else
{
EndXY.X += Math.Abs(e.X - StartXY.X);
EndXY.Y += Math.Abs(e.Y - StartXY.Y);
}
StartXY = e.Location;
Console.WriteLine("pictureBox1_MouseMove");
}
if (m_mouseDown && !rect.Contains(e.Location))
{
EndXY = e.Location;
}
Invalidate();
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (!m_movingRect)
{
EndXY = e.Location;
}
m_mouseDown = false;
m_movingRect = false;
Invalidate();
}
}
|
|
|
|
|
 Hi,
that still is too complex to my taste.
This is what works for me:
1.
I created my own Rect class, which basically is a rectangle, however it hides all its details from the Form/Panel/PictureBox.
Having a class, however simple it initially is, allows me:
- to treat the thing as an object;
- to make the code more readable;
- to add, at a later time, extra features, e.g. a more elaborate paint behavior without affecting the caller's code.
2.
There is no redundant data, reducing the probability of logic errors.
3.
My MouseDown and MouseUp handlers are extremely short, and my MouseMove handler, which holds all the logic, clearly has two parts (mouse up and mouse down).
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace RectMove {
public partial class Form1 : Form {
Rect rect;
bool m_mouseDown = false;
Rect movingRect = null;
Point prevMouseLoc;
public Form1() {
InitializeComponent();
this.DoubleBuffered = true;
}
private void Form1_Load(object sender, EventArgs e) {
rect = new Rect(200, 100, 100, 50);
}
private void panel1_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
rect.Paint(g);
}
private void panel1_MouseDown(object sender, MouseEventArgs e) {
m_mouseDown = true;
prevMouseLoc = e.Location;
}
private void panel1_MouseUp(object sender, MouseEventArgs e) {
m_mouseDown = false;
}
private void panel1_MouseMove(object sender, MouseEventArgs e) {
if (m_mouseDown) {
if (movingRect != null) {
Point mouseLoc = e.Location;
movingRect.Move(prevMouseLoc, mouseLoc);
prevMouseLoc = mouseLoc;
Invalidate(true);
}
} else {
movingRect = null;
if (rect.Contains(e.Location)) movingRect = rect;
}
Console.WriteLine("movingRect=" + movingRect);
}
}
public class Rect {
private static Pen pen=Pens.Red;
private Rectangle rect;
public Rect(int x, int y, int w, int h) {
rect = new Rectangle(x, y, w, h);
}
public override string ToString() {
return "Rect" + rect.Location+rect.Size.ToString();
}
public void Move(Point oldLoc, Point newLoc) {
rect.X += newLoc.X - oldLoc.X;
rect.Y += newLoc.Y - oldLoc.Y;
}
public bool Contains(Point pt) {
return rect.Contains(pt);
}
public void Paint(Graphics g) {
g.DrawRectangle(pen, rect);
}
}
Note: I don't clear movingRect after a move, as one could move a rectangle, then release and press the mouse button again without moving the mouse at all, so the rectangle IMO should continue its move.
modified 28-Apr-20 10:55am.
|
|
|
|
|
 I followed your steps, of course without using a class, now the move function determines whether to draw a new rectangle or move it, but the moving action is not happening. Resizing we will back to it later:
public partial class Form3 : Form
{
Rectangle rect;
Point StartXY;
Point EndXY;
int x = 0;
int y = 0;
int height = 0;
int width = 0;
bool m_mouseDown = false;
bool m_movingRect = false;
Pen rectPen = new Pen(Color.Red, 1);
public Form3()
{
InitializeComponent();
this.DoubleBuffered = true;
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics gObj = e.Graphics;
rect = new Rectangle(x, y, height, width);
rectPen.DashStyle = DashStyle.Dash;
gObj.DrawRectangle(rectPen, rect);
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
m_mouseDown = true;
if (rect.Contains(e.Location))
{
m_movingRect = true;
Console.WriteLine("m_mouseDown");
}
StartXY = e.Location;
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (rect.Contains(e.Location))
this.Cursor = Cursors.SizeAll;
else
this.Cursor = Cursors.Default;
if (m_mouseDown && rect.Contains(e.Location))
{
rect.X += e.X - StartXY.X;
rect.Y += e.Y - StartXY.Y;
StartXY = e.Location;
Console.WriteLine("pictureBox1_MouseMove StartXY " + StartXY.X);
Console.WriteLine("pictureBox1_MouseMove StartXY " + StartXY.Y);
Console.WriteLine("pictureBox1_MouseMove rect " + rect.X);
Console.WriteLine("pictureBox1_MouseMove rect " + rect.Y);
}
if (m_mouseDown && !rect.Contains(e.Location))
{
EndXY = e.Location;
x = Math.Min(StartXY.X, EndXY.X);
y = Math.Min(StartXY.Y, EndXY.Y);
height = Math.Abs(StartXY.X - EndXY.X);
width = Math.Abs(StartXY.Y - EndXY.Y);
}
Invalidate(true);
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (!m_movingRect)
{
EndXY = e.Location;
}
m_mouseDown = false;
m_movingRect = false;
Invalidate();
}
}
|
|
|
|
|
Hi,
1.
you have too many variables, this is called data redundancy. In particular you have both x,y,width,height and rect; in some parts you operate on x,y in others on rect.X and rect.Y, and that is why it does not behave as you would hope.
The rule is: avoid redundancy; there isn't anything positive about redundancy, it adds variables and code, and it just makes it harder to pinpoint logic errors.
Using a separate class helps in achieving this, or at least makes it harder to break the rule.
2.
To make matters worse, you change your data model (your "business logic") inside the Paint handler, where it says
rect=new Rectangle(x,...) .
You should never modify your business model inside a Paint handler; a Paint handler should behave as an observer, and not as a participant.
Reason: you don't know when a Paint handler will be executed:
(a) calling Invalidate tells the system your business model has changed and a repaint is required, so a repaint message is queued, but not executed right away (e.g. several calls to Invalidate may result in a single repaint);
(b) a Paint handler will also run when something happened to your window, e.g. when a pop-up dialog (may be from another app or from Windows itself) temporarily had hidden (part of) your window.
The only kind of variables your Paint handler should ever modify are the ones that are needed by the Paint handler itself, so it would be OK to write if (pen==null) pen=new Pen(Color.Red); assuming pen isn't part of your business stuff.
3.
I counted the number of lines in your code and mine, excluding empty lines, lines with a single bracket, comments, and Console.WriteLine lines; my code (Form+Rect) is 43 lines, yours 50. Which tells me using a class is the right way to go: it does not add to the code, and it supports what is known as "separation of concerns": let each piece of code take care of what matters to it without being troubled with details that don't matter there. Example: my form tells the Rect to paint itself or to move itself without caring how that is done, whereas the Rect knows how to paint or move itself without knowing why it should.
modified 29-Apr-20 9:01am.
|
|
|
|
|
Hi, all....
I am trying to execute the code below, but returns error due to date comparison :
<pre0>
cmd.CommandText = @"update TabFx set Date_xyz= @fer, Descrip=@descr where Date_xyz=" + Convert.ToDateTime(DataGridView1.SelectedRows[0].Cells[0].Value)
cmd.Parameters.AddWithValue("@fer", Convert.ToDateTime(DGV1.SelectedRows[0].Cells[0].Value));
cmd.Parameters.AddWithValue("@descr", DataGridView1.SelectedRows[0].Cells[1].Value);
cmd.ExecuteNonQuery();
Date_xyz is as field type DateTime in a MSAccess Table
How can I do this compare?
Thanks in advance!
|
|
|
|
|
Hi,
you are using a mix of parameter substitution (which is good) and direct string concatenation (which is bad).
When concatenating (which is bad) SQL expects dates or datetimes in a specific format and inside quotes.
Why don't you use AddWithValue() for the date as well?
Some examples[^]
|
|
|
|
|
Thanks for reply Luc...but the problem happens in the SQL command, when compare the field data (from the database) with the DataGridView cell that contains a date (sorry for the bad English...)...it returns error : "Wrong data type in criteria"
I don't know how to write the comparison...
the line is :
cmd.CommandText = @"update TabFx set Ferx =@fer, Descrip=@descr where Ferx="
+ Convert.ToDateTime(DGV1.SelectedRows[0].Cells[0].Value);
|
|
|
|
|
You can use a parameter in the WHERE part of your SQL statement just like you do in the SET part, so it could look like
CommandText = "... WHERE Ferx=@Ferx";
...
cmd.Parameters.AddWithValue("@Ferx", Convert.ToDateTime(DataGridView1.SelectedRows[0].Cells[0].Value));
Warning: IIRC you must provide the parameters (i.e. the calls to AddWithValue and the like) in the same order as the parameters appear in your SQL statement, since OleDb+Access does not really care about the parameter names!
|
|
|
|
|
ok Luc...I used your tip and it Works....thank you very much for the help 
|
|
|
|
|
you're welcome
|
|
|
|
|
|
Thank you Richard for the reading suggestion....I'll be Reading this.... 
|
|
|
|
|
Hi All,
I have a WinSCP Directory and have files in it. I need to get the date as 01_MMM (MMM represents the current month example- 01_APR and for May it should return 01_MAY so on and so forth) and I need to append this string '01_MMM' to the name of the file.
Please let me know how can I achieve that using C# Only.
Thanks,
Sriram
|
|
|
|
|
The System.IO namespace has lots of classes which you can use. There is some code as a good starting point here, list - Getting all file names from a folder using C# - Stack Overflow[^].
Social Media - A platform that makes it easier for the crazies to find each other.
Everyone is born right handed. Only the strongest overcome it.
Fight for left-handed rights and hand equality.
|
|
|
|
|
Thank you for your response but this is not in the regular windows directory. This directory is a remote path. I am connecting to this WinSCP directory by giving hostname,username and password.
EnumerateRemoteFiles is what I am using to read the file names but I am unable to find a function to rename them in remote directory.
|
|
|
|
|
Sriram Valluri wrote: WinSCP directory
I think what you mean then is that it is an ftp directory. Just google how to rename ftp files via c#.
Social Media - A platform that makes it easier for the crazies to find each other.
Everyone is born right handed. Only the strongest overcome it.
Fight for left-handed rights and hand equality.
|
|
|
|
|
|
 below is my code.
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = "ap*****",
UserName = "****",
Password = "******",
SshHostKeyFingerprint = "*******"
};
using (Session session = new Session())
{
session.ExecutablePath = @"WinSCP.exe path";
session.Open(sessionOptions);
List<RemoteFileInfo> files =
session.EnumerateRemoteFiles(
MonitorDirectory, FileSearchPattern, EnumerationOptions.None)
.ToList();
DateTime now = DateTime.Today;
ReportMonth = now.ToString("MMM").ToUpper();
foreach (RemoteFileInfo fileInfo in files)
{
------------------------------have to do renaming of the file here---------------------------
if (fileInfo.FullName.Contains(GetClientID))
{
if (fileInfo.Length > ThresholdValue)
{
FileModifiedDate = fileInfo.LastWriteTime.ToString("yyyyMM", CultureInfo.InvariantCulture);
if (GetReportDateYM == FileModifiedDate || fileInfo.FullName.Contains(ReportMonth))
{
FileName = fileInfo.FullName;
Dts.Variables["User::FileName"].Value = FileName;
Dts.Variables["User::FileDate"].Value = FileModifiedDate;
Dts.TaskResult = (int)ScriptResults.Success;
break;
}
}
}
So here I have a directory in remote server and I am accessing it through WinSCP tool. requirement is to rename the files insider this remote directory. I can read each and every file name but I am not able to find rename function here.
|
|
|
|
|
Hi,
I have no experience with WinSCP, however browsing the documentation I'm now convinced what you need is here[^].
Google is your friend, treat him well.
|
|
|
|
|
Thank you Luc Pattyn. will go through the same.
|
|
|
|
|
Dear all,
I am sorry by now, I want to use Multicombobox in datagridview,
I have access file have two table :ItemAll, Pur in acccess file.Column Items in datagridview1 is Combobox,
1- I want to create column of items as multicombobox ,when click on culumn Items , its doplist table ItemAll have two column :Items,NameItem.
2-In datagridview , when click multicombobox anh selcect Items column in combobox , In columm datagridview will receive data .
I have added Multicombobox.cs, MulticomboboxPopup in project, I use dataset ACCSDataset.
Thank you
My email:[DELETED]@gmail.com
modified 27-Apr-20 1:25am.
|
|
|
|
|
Never post your email address in any forum, unless you really like spam! If anyone replies to you, you will receive an email to let you know.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|