Laden...

Forenbeiträge von ChrisProg Ingesamt 174 Beiträge

05.06.2013 - 16:18 Uhr

verwendetes Datenbanksystem: SQL-Server 2008 R2

Hallo zusammen,

wer kann mir bitte das Verhalten erklären?

Ich habe einen SQL-Befehl (nur zur Info)


Select 1 AS mandant, 'VR' as vg_art, d050056.pos_typ as vg_typ, d050056.vg_nr,
         d050056.pos_nr, d050055.vg_dat, d050055.verl_dat, d050055.lief_dat, 
         d050055.kdnr as adr_nr, d010011.suchname as adr_suchname, d050055.abw_re,
         d050056.artikel_nr, d010015.matchcode, d050056.pos_bez, d050056.vg_mge, 
         d050056.vg_krt, d050056.vg_epreis, d050056.vg_gpreis, d050056.endrabpos, 
         d050056.endrabzws, d050056.posrabproz, d050056.poswrtstlg, d050056.prov_satz, 
         d050055.vg_nr_53, d050055.vg_nr_57, d050055.vg_nr_59, d050051.vg_dat as auftr_dat, 
         '€' as waehrung 
         FROM [EasyFood-001].[dbo].d050056 AS d050056 
         LEFT OUTER JOIN [EasyFood-001].[dbo].d050055 AS d050055  ON d050056.vg_nr = d050055.vg_nr 
         LEFT OUTER JOIN [EasyFood].[dbo].d010015 AS d010015  ON d050056.artikel_nr = d010015.artikel_nr 
         LEFT OUTER JOIN [EasyFood-001].[dbo].d010011 AS d010011  ON d050055.kdnr = d010011.kdnr 
         LEFT OUTER JOIN [EasyFood-001].[dbo].d050051 AS d050051  ON d050055.vg_nr = d050051.vg_nr_55 
         LEFT OUTER JOIN [EasyFood-001].[dbo].d050053 AS d050053  ON d050055.vg_nr_53 = d050053.vg_nr 
         LEFT OUTER JOIN [EasyFood-001].[dbo].d050057 AS d050057  ON d050055.vg_nr_57 = d050057.vg_nr 
         LEFT OUTER JOIN [EasyFood-001].[dbo].d050059 AS d050059  ON d050055.vg_nr_59 = d050059.vg_nr 
         WHERE CASE WHEN d050056.posvertrnr = 0 THEN d050055.vertrnr ELSE d050056.posvertrnr END Between 0 AND 1  
         AND d050055.rg_datum Between '01.01.1753 00:00' AND '31.12.9999 00:00' 
         AND d050055.abw_re Between '0' AND '999999999' AND d050056.artikel_nr Between '' AND 'zzzzzzzzzzzzzzz' 
         AND d050056.pos_typ <> 'T' 
         AND d050056.pos_typ <> 'Z' 
         AND d050056.pos_typ <> 'R' 
         AND d050056.poswrtstlg <> 4 
         ORDER BY d050056.vg_nr, d050056.pos_nr OPTION (RECOMPILE)

der folgendes Verhalten aufweist:

  • in MS SQL Sever Mangement Studio 10 braucht er lt. Anzeige ca. 5 Sekunden für etwas über 57000 Zeilen (sehr schnell)
  • in VS2010 als SqlCommand in der GUI braucht er ca. 20 Sekunden (mit diesem Code)
select_SQL = <obiger Befehlsstring>
cmd_cKartei = new SqlCommand(selectSQL, connectionSQL_MD);
da_ar = new SqlDataAdapter(cmd_cKartei);
da_ar.Fill(cKartei); "
  • in VS2010 als SqlCommand in einem BackgroundWorker braucht er ca. 4-5 Minuten !!!

Wie ihr seht habe ich auch schon die Ausführungen zu Parameter Sniffing gesehen u. deshalb "OPTION (RECOMPILE)"
oder


...WHERE CASE WHEN d050056.posvertrnr = 0 THEN d050055.vertrnr ELSE d050056.posvertrnr END Between @von_wert AND @bis_wert ...

cmd_cKartei.Parameters.Add("@von_wert", SqlDbType.Int).Value = 0;
cmd_cKartei.Parameters.Add("@bis_wert", SqlDbType.Int).Value = 1;  

als Parameter eingebaut; es brachte aber gar nichts.

Auch wenn hier mehrfach zu lesen war das man die Daten nicht im Backgroundworker holen sollte, frage ich mich generell woher diese großen Unterschiede zwischen den einzelnen Ladezeiten kommen.

Den Backgroundworker wollte ich verwenden, damit die Maske nicht währen des Ladens hängt.

Wäre schön, wenn das jemand ein bisschen Licht in das Dunkel bringen könnte.

MfG ChrisProg

10.05.2013 - 10:06 Uhr

Hallo Programmierhans,

danke für deine Hilfe (ich wäre nie im Leben auf diese Idee gekommen, geschweige denn, das so etwas überhaut möglich ist - viel zu lernen ich wohl noch hab 😉 )

Ich hatte mir bis jetzt noch nie Gedanken darüber gemacht, das der Quellcode beim Laden auf die Form in der Entwicklungsumgebung schon ausgeführt wird.
Somit passierte folgendes:
die Konfigurationsdatei, die mit Ini.Read abgefragt wurde, existiert natürlich nicht in den VS-Standardverzeichnissen. Somit wurde false zurückgegeben u. das Control nicht angezeigt.

Nachdem ich nun eine Überprüfung für den DesignModus mit eingebaut habe, u. diese entsprechend abfrage, funktioniert alles


public static bool IsInDesignMode()
{
    if (Application.ExecutablePath.IndexOf("devenv.exe", StringComparison.OrdinalIgnoreCase) > -1)
    { return true; }
    return false;
 }

private void ATapiControlButton_Load(object sender, EventArgs e)
{
...
if (IsInDesignMode())
{ this.Visible = true; }
 else
{ this.Visible = (ini.Read("Tapi", "TapiFunktion", "OFF").ToUpper() == "ON") & darf_tapi_ermitteln(); }
...
}

Vielen Dank nochmal

MfG ChrisProg

08.05.2013 - 16:07 Uhr

Ich kann anscheinend keine zwei Bilder änhängen , deshalb nun das zweite Bild.

08.05.2013 - 16:02 Uhr

Hallo zusammen,

ich habe ein UserControl erstellt, welches eigentlich nur aus den Control u. einem eingebettenen Button besteht.

Mit Hilfe dises Button will ich eine Tapi-Schnittstelle bedienen (aber das nur als grundsätzlicher Hinweis) --> das funktioniert auch alles wunderbar. 🙂

Was mich nur wahnsinnig stört ist, das, wenn ich das User Control auf eine WindowsForm ziehe, sehe ich nur folgendes (siehe Anhang UserControlDesigner01.jpg) :
eine Platzhalter für das Control der nicht verschoben werden kann.

Gehe ich mit dem Mauszeiger in eine der Ecken u. ändere durch ziehen die Größe des UserControls, so wird der Button plötzlich sichtbar, das Control ist jetzt da und kann auch verändert werden (siehe Anhang UserControlDesigner02.jpg).

Speichere ich die Form, schließe sie, u. öffne sie anschließend wieder, so ist es genauso wieder wie beim Einfügen der Controls in die Form. 😜

Ich hab mir schon die Finger wundgegoogelt, aber leider nicht viel dazu gefunden; auch habe ich schon mit AutoSizeMode, Location, Locked, MaxSize, MinSize sowohl des Controls als auch des Button experimentiert aber leider ohne Erfolg, ebenso this.SetStyle 🙄

ich bin für jede Hilfe wirklick dankbar.

MfG ChrisPorg

hier mal der gesamte Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using JulMar.Atapi;
using System.CodeDom.Compiler;

namespace ATapiControl
{
    [ToolboxBitmap(@"f:\VS-Programm\VS-Klassen\ATapi\ATapiControl\phone.bmp")]
    [Description("Tool um eine Rufnummer per TAPI zu wählen \r\n" +
                 "(siehe \"Benutzung von ATapiControl.docx \" )")]
    public partial class ATapiControlButton : UserControl
    {
        private string _rufnummer = String.Empty;

        public string rufnummer
        { get; set; }
        public string benutzer
        { get; set; }

        TapiManager TapiPhone = new TapiManager("Phone.Net");
        TapiLine activeLine = null;
        TapiAddress activeNumber = null;
        TapiCall tc = null;
        Boolean iscalling = false, fuehrende_null = false;
        
        Ini_Datei ini = new Ini_Datei(System.Windows.Forms.Application.StartupPath + "\\sql.ini");
        string TapiGeraet = String.Empty, TapiNr = String.Empty;

        public event EventHandler ATapiControlClick;

        protected virtual void OnATapiControlClick(EventArgs e)
        {
            EventHandler myEvent = ATapiControlClick;
            if (myEvent != null)
            { myEvent((this.Controls.Owner).Name, e); }
        }

        public ATapiControlButton()
        {
            InitializeComponent();
            benutzer = "";
            //this.SetStyle(ControlStyles.ContainerControl  |
            //              ControlStyles.Opaque |
            //              ControlStyles.Selectable |
            //              ControlStyles.DoubleBuffer |
            //              ControlStyles.UserPaint |
            //              ControlStyles.AllPaintingInWmPaint |
            //              ControlStyles.SupportsTransparentBackColor |
            //              ControlStyles.ResizeRedraw, true);
            this.BackColor = Color.Transparent; 
        }

        private void ATapiControlButton_Load(object sender, EventArgs e)
        {
            #region TapiPhone
            if (TapiPhone != null && TapiPhone.Initialize())
            {

                TapiGeraet = Environment.GetEnvironmentVariable("TapiLine", EnvironmentVariableTarget.User);
                TapiNr = Environment.GetEnvironmentVariable("TapiNr", EnvironmentVariableTarget.User);
                foreach (TapiLine line in TapiPhone.Lines)
                {
                    if (TapiGeraet == String.Empty)
                    {
                        // Vorbelegung wenn noch nicht gespeichert
                        TapiGeraet = line.Name.ToString().Trim();
                    }
                    if (line.Name.ToString().Trim() == TapiGeraet)
                    {
                        activeLine = line;
                        line.CallStateChanged += this.OnCallStateChanged;
                        break;
                    }
                }
                if (activeLine != null)
                {
                    foreach (TapiAddress x_adress in TapiPhone.Lines[activeLine.Id].Addresses)
                    {
                        if (TapiNr == String.Empty)
                        {
                            TapiNr = x_adress.ToString();
                        }
                        if (x_adress.ToString().Trim() == TapiNr)
                        {
                            activeNumber = x_adress;
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("No Tapi devices found.");
                this.Enabled = false;
            }

            #endregion

            fuehrende_null = ini.Read("Tapi", "FührendeNullen", "Nein").ToUpper() == "JA";
            this.Visible = (ini.Read("Tapi", "TapiFunktion", "OFF").ToUpper() == "ON") & darf_tapi_ermitteln();
        }

        private bool darf_tapi_ermitteln()
        {
            if (benutzer.Trim() == String.Empty)
                return true;

            Boolean darf_tapi = false;

            SQL_login sqllogin = new SQL_login();
            SqlCommand command = new SqlCommand("SELECT tapi_kz FROM d001000 WHERE benutzer = '" + benutzer.Trim() + "'", sqllogin.connection_SQL());
            SqlDataReader r_d001001 = null;
            try
            {
                r_d001001 = command.ExecuteReader();
                if (r_d001001.Read())
                {
                    darf_tapi = r_d001001.GetBoolean(0);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if (!r_d001001.IsClosed)
                {
                    r_d001001.Close();
                }
                r_d001001.Dispose();
            }
            return darf_tapi;
        }

        public void anrufen()
        {
            #region nicht-Zahlen entfernen
            String pruef_rufnummer = rufnummer;
            rufnummer = String.Empty;
            for (int i = 0; i < pruef_rufnummer.Length; i++)
            {
                if ((int)Convert.ToChar(pruef_rufnummer[i].ToString()) >= 48 && (int)Convert.ToChar(pruef_rufnummer[i].ToString()) <= 57)
                {
                    rufnummer += pruef_rufnummer[i];
                }
            }
            #endregion

            if (rufnummer != null && rufnummer.Trim() != String.Empty)
            {
                if (fuehrende_null)
                {
                    if (!rufnummer.StartsWith("00"))
                    { rufnummer = "0" + rufnummer; }
                }
                if (iscalling)
                {
                    if (!(tc.CallHandle).IsClosed)
                    {
                        tc.Drop();
                    }
                    iscalling = false;
                    make_call.BackgroundImage = Properties.Resources.hoerer_gruen_klein;
                    if (CurrentLine.IsOpen)
                    {
                        line_start_stop();
                    }
                }
                else
                {
                    if (!CurrentLine.IsOpen)
                    {
                        line_start_stop();
                    }
                    try
                    {
                        tc = CurrentAddress.MakeCall(rufnummer);
                        iscalling = true;
                        make_call.BackgroundImage = Properties.Resources.hoerer_rot_klein;
                    }
                    catch (TapiException ex)
                    {
                        MessageBox.Show(ex.Message);
                    }

                }

            }

        }

        #region Prozeduren für TapiPhone
        TapiLine CurrentLine
        {
            get
            {
                return activeLine;
            }
        }

        TapiAddress CurrentAddress
        {
            get
            {
                return (TapiAddress)activeNumber;
            }
        }

        #endregion

        private void line_start_stop()
        {
            TapiLine line = CurrentLine;
            if (line.IsOpen)
            {
                line.Close();
            }
            else
            {
                try
                {
                    line.Open(line.Capabilities.MediaModes);
                }
                catch (TapiException)
                {
                    line.Open(MediaModes.DataModem);
                }
            }
        }

        private void OnCallStateChanged(object sender, CallStateEventArgs e)
        {
            if (this.InvokeRequired)
            {
                EventHandler<CallStateEventArgs> eh = OnCallStateChanged;

                this.BeginInvoke(eh, new object[] { sender, e });
                return;
            }

            TapiLine line = (TapiLine)sender;
            TapiCall call = e.Call;

            if (call.CallState == CallState.Idle)
            {
                call.Dispose();
                if ((call.CallHandle).IsClosed)
                {
                    make_call.BackgroundImage = Properties.Resources.hoerer_gruen_klein;
                    iscalling = false;
                    if (CurrentLine.IsOpen)
                    {
                        line_start_stop();
                    }

                }
            }
        }

        private void make_call_Click(object sender, EventArgs e)
        {
            OnATapiControlClick(EventArgs.Empty);
            anrufen();
        }

        public void PerformClick(string x_rufnummer)
        {
            rufnummer = x_rufnummer;
            anrufen();
        }

    }
}
08.02.2013 - 09:17 Uhr

Hallo zusammen,

da ich mit Hilfe der Suche (hier im Forum u. bei Google) nicht fündig wurde, möchte ich folgende Frage stellen:

Ist es Möglich eine Form zu "overriden" ?

was ich möchte, ist folgendes:

Test neuertest = new Test(paremeter1, parameter2, etc)

Ich möchte per Override nur bestimmte (von mir definierte) Möglichkeiten anbieten, ähnlich wie es die Messagebox in der Show-Methode auch macht.
Wenn ich in der Klasse der Form Test folgendes einbaue:


public Test(parameter1)
{

}
public Test(parameter1, parameter2)
{

}
public Test(parameter1, parameter2, parameter3)
{
   .. die Hauotmethode, auf der die anderen abgeletet werden sollen
}

Nun kann ich zwar beim Aufruf "new Test" die verschieden Möglichkeiten sehen, doch ich habe keine Idee, wie ich nun die Hauptmethode aufrufen muß,


public Test(parameter1)
{
   Test(parameter1, null, null);
}

führ leider zu Fehlern wie "Test ist ein(e) Typ, wird aber wie ein(e) Variable behandelt"


public Test(parameter1)
{
   Test x_test = new Test(parameter1, null, null);
}

führt zwar zu keinem Fehler, führ aber nicht meine Form aus, sondern erstellt eine neue Standardform 😜

Hat irgendjemand dazu eine Idee ?

MfG ChrisPorg

27.10.2011 - 13:21 Uhr

Hallo Joetempes,

danke für Deine Antwort. Wie vermutet habe ich den Baum vor lauter Wald nicht gesehen:

ich hab mir das ResponseArray im Debugger angeschaut, und dabei nicht beachtet, das mir die Werte ja in dezimal angezeigt werden 😜

Danke 👍

Weist Du oder auch ein anderer geschätzter Kollege zufällig auch wie ich die Versichertendaten aus einer eGK korrekt auslesen kann:

denn lt: "gematik_Leitfaden_Implementierung_Lesen_eGK_V120.pdf"

muß ich

  1. den Leser zurücksetzen (20 11 00 00 00)
  2. die Karte anfordern (20 12 01 00 01 05)
  3. eGK Root selektieren (00 A4 04 0C 07 D2 76 00 01 44 80 00)
  4. selektion von DF.HCA (00 A4 04 0C 06 D2 76 00 00 01 02)
  5. lesen der Länge PD aus EF.PD (00 B0 81 00 02)
  6. lesen PD aus EF.PD (00 B0 00 02 00 02 85) -->Wert1 u. Wert2 aus Antwort von 5)
    nur dabei bekomme ich immer den Retwert -1 --> ungültiger Parameter

das gleiche passiert beim Versuch die VD oder die GVD auszulesen.

Im Anhang B des o.g. PDF´s steht sogar ein " CT-Api-Protokoll einer Leseroutine" wo ich genau sehen kann wie Sie die Commands aufgebaut haben, aber ich bekomme immer nur ungültiger Parameter zurück.

Wie gesagt, ich brauche nur die Versichertendaten (wie in der KVK auch), der geschützte Bereich interessiert mich im Moment überhaupt nicht.

Für weitere Hilfe wäre ich sehr dankbar.

MfG ChrisProg

24.10.2011 - 16:56 Uhr

Hallo zusammen,

weiß irgendjemand wie ich aus einer Krankenversicherungskarte, bei der das Terminal nach ASN.1-Format eingestellt ist, die Daten auslesen kann?

zwar gibt es viele Doku´s, die aber nicht sagen (zumindest verstehe ich es nicht) wie man die Daten strukturiert auslesen kann.

Ich habe folgendes erfolgreich gemacht:

ct_init,
reset_ct (Command = 0x20, 0x11, 0x00, 0x00, 0x00),
request_icc (Command = 0x20, 0x12, 0x01, 0x00),
get_status (Command = 0x20, 0x13, 0x00, 0x46, 0x00);
--> gem Byte 45 ist Terminal in ASN.1-Format
select_file (Command = 0x00, 0xA4, 0x04, 0x00, 0x06, 0xD2, 0x76, 0x00, 0x00, 0x01, 0x01);
read_binary (Command = 0x00, 0xB0, 0x00, 0x00, 0x00);
--> dabei erhalte ich aber nur die gesamten Daten in variabler Länge, was eigentlich nicht so schlimm wäre, wenn nicht Felder wie Titel, Namenszusatz, WOC fehlen würden, da nicht gefüllt.

Also muß ich wohl die Daten über das Application-File auslesen.
Ich habe aber leider keinen blassen Schimmer wie ich die TAG´s einzeln auslesen soll?
zb.: Tag 80 = Krankenkassenname
Tag 81 = KrankenkassenNr
...
Tag 8E = Prüfsumme

Kann mir da bitte mal jemand auf die Sprünge helfen?

MfG ChrisProg

17.09.2010 - 08:18 Uhr

Tja, das dachte ich auch,

aber anscheinend ist VS nicht abwärtskompatibel.

Doppelklick auf die Kalendercontrol.sln --> nichts passiert !!!

Neues Projekt, manuelles Einfügen der *.cs-Dateien --> funktioniert,

aber beim Aufruf z.B. des MainViews erhalte ich nur folgende Zeile:

Beim Laden des Designers sind die nachfolgend aufgeführten Fehler aufgetreten.
Einige können durch Neuerstellen des Projekts behoben werden, andere erfordern möglicherweise Änderungen am Code.
Die Variable itemCollection1 wurde nicht deklariert oder nicht zugeordnet.
Der Typ KalenderTestAnwendung.ItemCollection wurde nicht gefunden. Stellen Sie sicher, dass auf die Assembly, die diesen Typ enthält, verwiesen wird. Wenn dieser Typ Teil Ihres Entwicklungsprojekts ist, stellen Sie sicher, dass das Projekt erfolgreich generiert wurde.
Der Typ KalenderTestAnwendung.Calendar wurde nicht gefunden. Stellen Sie sicher, dass auf die Assembly, die diesen Typ enthält, verwiesen wird. Wenn dieser Typ Teil Ihres Entwicklungsprojekts ist, stellen Sie sicher, dass das Projekt erfolgreich generiert wurde.
Die Variable calendar1 wurde nicht deklariert oder nicht zugeordnet.
bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager, String exceptionText, String helpLink)
bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression (IDesignerSerializationManager manager, String name, CodeExpression expression)
bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression (IDesignerSerializationManager manager, String name, CodeExpression expression)
bei System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement (IDesignerSerializationManager manager, CodeStatement statement)

also scheint Downgrade leider nicht möglich zu sein, deshalb meine Frage.

Gruß ChrisProg

16.09.2010 - 16:05 Uhr

Hallo Aratar,

hast Du das Kalenderprojekt auch für VS2005 ??

MfG ChrisProg

16.09.2010 - 13:43 Uhr

Hallo zusammen,

kann mir jemand mal ein Beispiel für die Zusammenarbeit eines c# Desktop-Programms mit einem WM6-Handy geben???

Ich weiß, das ich mit Hilfe von POOM alle möglichen Punkte ansprechen kann, aber eben nur von einer Anwendung, die auf dem CE-Gerät läuft.

Aber wie kann man die Daten von einem Desktop-Programm aus steuern (natürlich mit aktivierten ActiveSync); ich kann mir nicht vorstellen, das Outlook ein Programm auf dem CE startet um sich abgleichen zu können.

Ich weiß auch, das es CeRapiInvoke gibt, aber mir ist die zusammenarbeit nicht klar.

Für Erleuchtung in jeder Richtung dankbar ...

MfG CrisProg

16.04.2010 - 08:10 Uhr

Hallo zusammen,

für alle, die dieses Problem auch haben, hier nun die Lösung:

Wenn in der Form "MinimizeBox auf true steht, wird das Programm nur minimiert ("Smart Minimize"); stellt man diesen Wert aber auf false, so wird aus dem "X" ein "OK" und das Programm wird beendet.

MfG ChrisProg

14.04.2010 - 09:17 Uhr

Hallo vbprogger,

ich weiß nicht ,ob wir von den gleichen Grundbedingungen reden:

Betriebssystem = WM6.1
.NetFramework = 2.0
Programmiersprache = VS 2005 C#

Zielgerät lt. Projekt: Windows CE 5.0 Gerät ( weil selbst WM6 darunter laufen muß 🤔 )

Selbst das von Dir gezeigte Delegate feuert nicht auf die Closing-Methode 😜

MfG ChrisProg

14.04.2010 - 08:45 Uhr

Hallo Jake,

danke für den Tipp, aber wie kann ich ihn einbinden ??? 🤔.

Im Ernst: das Programm wird über das "X" beeendet.
--> ich nahm an, dass dann wenigstens eins der beiden Ereignisse Form.Closed oder Form.Closing gefeuert wird, aber nada ?!? 🙄

Hast Du dazu eine Idee ?

MfG ChrisProg

14.04.2010 - 07:58 Uhr

Hallo herbivore,

es tut mir leid, aber unter CF 2 gibt es kein Environment.Exit.

MfG ChrisProg

13.04.2010 - 08:47 Uhr

Hallo zusammen,

da ich beim Googeln nichts darüber finden kann, mache ich nun diesen Thread auf.

Wie kann ich unter WindowsMobile ein Programm per Quellcode "richtig" beenden, so das es auch im TaskManager nicht mehr auftaucht ???

Hintergrund: ich benutze eine Passwortabfrage, die aber nur beim Programmstart aktiviert wird.
Wenn also das Programm nicht komplett beendet wird, so wird die Passwortabfrage übergangen.

MfG ChrisProg

28.01.2009 - 14:40 Uhr

Hallo JAck30lena,

ich danke Dir für das Brainstorming 8)

Ich werde in den nächsten Tagen versuchen das Umzusetzten.

Bis dahin erst einmal Danke.

MfG ChrisProg

28.01.2009 - 13:31 Uhr

Hallo,

also mit XML habe ich mich noch nicht beschäftigt ( ich finde den Umstieg VFP - C# schon für den Anfang schwer genug ) .

Mach mal einen Vorschlag.

MfG ChrisPorg

28.01.2009 - 13:02 Uhr

Hallo,

was meinst Du genau mit was drehen?

Die Werte sind irgendwie schon vorgegeben, die Reihenfolge des Einlesens ergibt sich aus der Order nach x_prog_nr und x_par_prog.

Ich muß ja est die Hauptmenüeinträge erstellen, bevor ich dazu Untermenüeinträge erstellen kann, sonst sagt mir das Programm ja zurecht, das der Menüeintrag nicht vorhanden ist.

MfG ChrisProg

28.01.2009 - 12:16 Uhr

Hallo,

Beispiel:
Bedeutung der Varaiablen:
x_prog_nr --> lfdProgrammNr hier gleichzeitig MenuItemNr
x_text --> Menübeschriftung
x_par_prog --> wenn ungleich 0 dann ist es ein Untermenüpunkt von MenuItemNr (x_par_prg)

  1. Eintrag:
    x_prog_nr = 1
    x_text = 'Programme'
    x_par_prog = 0
    bedeutet: es soll ein Hauptmenüeintrag mit der Bezeichnung 'Programme' werden

...
...

x. Eintrag:
x_prog_nr = 101
x_text = 'Stammdaten'
x_par_prog = 1
bedeutet: es soll im Menü 'Programme' ein Untermenü 'Stammdaten' erstellt werden

...
...

y.Eintrag
x_prog_nr=10101
x_text= 'Kundenstamm'
x_par_prog = 101
bedeutet: es soll im Untermenü 'Stammdaten' ein Menüeintrag 'Kundenstamm' erstellt werden, bei dem ich dann auch noch einstellen will, welche Exe-Datei bei Click geöffnet werden soll.

So, ich hoffe, das ich mich nun einigermaßen verständlich ausgedrückt haben.

28.01.2009 - 11:31 Uhr

Hallo,

ich will mir einfach tausende ( 🤔 ) Zeile Code sparen.
Im Moment mach ich das nämlich diskret mit Case-Anweisungen. Das Problem dabei, je tiefer man in eine Unterstruktur kommt, um so umfangreicher sind dann leider die Möglichkeiten, die dann ja auch behandelt werden müssen. Ich spreche hier von ca. 40 bis 100 unterschiedlichen Menüeinträgen auch auf Submenü-Ebene.

Und wie gesagt mit FoxPro und Makrosubstitution hatte ich das mit ca. 30 Zeilen Code erledigt 😁

MfG ChrisProg

28.01.2009 - 11:14 Uhr

Hallo,

es hakt eigentlich nirgendwo.

Ich weiß, wie ich ein Menü mit all seinen Eigenschaften und Metoden erstellen kann. Auch weiß ich wie ich SubMenü-Einträge erstelle.
Nur ich weiß halt zur Entwicklungszeit noch nicht, welche Menüeinträge genommen / erstellt werden sollen; das entscheidet sich erst während der Laufzeit durch das Auslesen einer entsprechenden Tabelle, und die könnte sich je User ändern.

MfG ChrisProg

28.01.2009 - 10:48 Uhr
"hauptmenu;submenu1;submenu2;submenu3;" den string nach ";" aufzusplitten und ein menu zu erzeugen und je submenu ein subitem hinzuzufügen

und wie machst Du das dann ( ich meine natürliche das mit dem Menü erzeugen, das mit dem String aufsplitten ist ja "peanuts" )?

Ich muß definitif eine String-Variable haben, mit der ich ein Obejkt erstellen und anschließend mit dieser Variablen als Referenz drauf zugreifen kann (Eigenschaften einstellen z.B. oder auch wie Du schon schreibst ein SubMenuItem einfügen kann).

MfG ChrisProg

28.01.2009 - 10:03 Uhr

Hallo JAck30lena,

kannst Du mir eventuell ein Codebeispiel zeigen oder linken?
Ich suche nämlich schon seit Tagen nach so etwas im Netz / Onlinehilfe, hab aber nie etwas ( nicht einmal ansatzweise ) gefunden.
Wie gesagt: ich weiß nicht, wie ich aus einem String ein Objekt erstellen kann ( der umgekehrte Weg ist ja recht einfach ).

MfG ChrisProg

28.01.2009 - 09:17 Uhr

Hallo zusammen,

ich komme aus der FoxPro-Entwicklung und arebeite mich nun in C# ein.

Dazu habe ich eine grundsätzliche Frage:
Ich weiß, das es Makrosubsititution in C# nicht gibt.
(Zur Erklärung: wenn man in VFP in eine Variable z.B. "tabelle.feld1" schreibt und anschließend bei dieser Variablen eine Makrosubstitution durchführt, so erhält man den Inhalt des genannten Tabellenfeldes --> dies ist eine sehr nützliche Funktion, wenn man zur Entwicklungszeit noch nicht genau die Variable/ das Feld kennt, so kann man es sich halt als String aufbauen und anschließend als Objekt benutzen)

Wie kann man so etwas in C# lösen ?
Konkret gefragt, gibt es eine Möglichkeit aus einem String zur Laufzeit ein Objekt zu erstellen? In meinem konketen Gedankenspiel möchte ich ein dynamisches Menü erstellen, d.h. ich weiß zur Entwicklungszeit noch nicht, welche Einträge vorhanden sein werden.

MfG ChrisProg