Laden...

Forenbeiträge von BerndFfm Ingesamt 3.825 Beiträge

27.05.2021 - 15:29 Uhr

Ich muss aus einem anderen Grund auch mehrere exe Dateien erzeugen. Umbenennen kann ich nicht da dann die TextControl Lizenz nicht mehr geht.

Ich kopiere per Programm die SLN-Datei und ersetze in dieser die Namen die brauche. Dann wird halt x Mal übersetzt, aber das stört mich nicht.

Grüße Bernd

26.05.2021 - 10:25 Uhr

Ich benutze auch noch Crystal Reports und installiere beim Kunden immer neueste Runtime. Das hat schon öfter Probleme gegeben.

Am Ende habe ich mir so beholfen dass ich die DLL's auch in das App Verzeichnis kopiert habe.

Die meisten Reports habe ich inzwischen auf Microsoft Report Builder umgestellt, der ist eh besser zu bedienen und braucht vor allem keine lokale Installation.

Grüße Bernd

25.05.2021 - 20:30 Uhr

Danke für die tolle Übersicht.

Leider ist der Ton teilweise nicht sehr gut, da viele von zuhause senden.

Grüße Bernd

11.05.2021 - 11:24 Uhr

Mach es doch vor dem Serialisieren :


if (checkBoxVorname.Checked) person.Vorname = textBoxVorname.Text; else person.Vorname = null;
if (checkBoxNachname.Checked) person.Nachname = textBoxNachname.Text; else person.Nachname = null;

1 Zeile pro Feld, geht doch.

Natürlich kannst Du auch die Textboxen in einer Schleife durchgehen und die Checkbox dazu abfragen, aber Du musst es ja eh der Klasse zuweisen.
Finde ich auch nicht so elegant.


foreach(Control ctrl in ..Controls)
{
    string tb = ctrl.Name;
    string cb = ctrl.Name.Replace("textBox","checkBox");
    if (tb.Startswith("textBox")) (CheckBox)Controls[cb] ...
}

Grüße Bernd

05.05.2021 - 22:17 Uhr

Die Informationen müssen dann ja noch vom PC zum Raspberry übertragen werden.

DMX ist natürlich totaler Overkill, aber ist sehr robust und bewährt.

Ist eine serielle Technologie (RS485) : Störsicher und man kann lange Kabel legen.

Ist auch nicht so teuer wie ich dachte, um die 100 Euro die Hardware.

Hier eine Einführung in DMX von meinem Kumpel Mike : https://www.youtube.com/watch?v=1Lza-jJp9-g

Bin gespannt welche Lösung es werden wird.

Grüße Bernd

05.05.2021 - 21:28 Uhr

Man kann ja beide Hardware kaufen und testen, kostet ja nichts.

Mit DMX gibt es auch professionelle Hardware für Lichtsteuerung : https://www.led-studien.de/dmx-led-controller/

Hier gibt es ein C# Framework dafür : redpawfx/quickDMX512

Hier eine fertige Platine für 30 LED's : https://www.xmas-land.de/30-Kanal-DMX-512-Controller-Platine#false

Grüße Bernd

05.05.2021 - 17:22 Uhr

Der Raspi ist da etwas überqualifiziert glaube ich.

Mit einem Arduino geht das auch : https://starthardware.org/blink-start-mit-arduino/

Bei mehreren oder größeren LED's macht man Transistoren dazwischen als Verstärker.

Beim Arduino ist das Ein- und Ausschalten einfacher und die Kommunikation mit dem PC.

Meiner Meinung nach.

Mit einem ESP32 oder ESP8266 geht das auch per WLAN oder Bluetooth.

Grüße Bernd

05.05.2021 - 11:57 Uhr

Wenn Du was selbst bauen willst kannst Du einen Arduino per USB anschließen, den kann man seriell ansteuern. Da gibt es bestimmt fertige Platinen für die Ansteuerung von LED's.

Einen Arduino kann man sehr gut in Visual Studio programmieren in C#.

Ich glaube hier kann man jede LED einzeln ansteuern : https://starthardware.org/viele-leds-mit-arduino-steuern-ws2812/

Das sind mal viele LED's : Amazing 16x16x16 RGB LED cube - Embedds

Grüße Bernd

04.05.2021 - 21:30 Uhr

Hallo Ruzbacky,

ich verstehe den Unterschied deiner 2 Möglichkeiten nicht so ganz.

Typisierte DataSets nimmt man nicht mehr.

Am besten lässt Du das Mapping jemand machen, z.B. ein ORM oder Micro ORM.

Den Connectionstring hinlegst Du natürlich so dass er vom Benutzer geändert werden kann.

Schau mal hier : https://download.seven-c.de/files/DatenbankenHowTo.htm

Grüße Bernd

04.05.2021 - 14:41 Uhr

Ist schon lange her dass ich das Oracle Typ Mapping gemacht habe, auf jeden Fall mehr als 12 Jahre.

Damals wurde mir von den Experten das "decimal" als Datentyp für ein logisches Feld genannt.

Der Vorteil des Mappings : Man kann den Typ ganz einfach ändern im Source und sofort auf die neuen Datentypen zugreifen.

Das kommt auch dann vor wenn ein Datenbank Update neue Datenbanktypen bringt die geeigneter sind (MS SQL Datumstyp Date oder Datetime2).

Performance ? Das Mapping oben war ca. 5% langsamer als typisierte DataSets. Ca. 10 Mal schneller als ein damaliges ORM.

Grüße Bernd

04.05.2021 - 14:15 Uhr

Ich erzeuge meine C# Zugriffsklassen automatisch aus der Datenbank.

Das Mapping ist fest hinterlegt, sind ja nur wenige Datentypen die es gibt.


public int    nr { get { return ad_nr; } set { ad_nr = value; } }
public string    match { get { return ad_match; } set { ad_match = value; } }
public string    anrede { get { return ad_anrede; } set { ad_anrede = value; } }
public string    name1 { get { return ad_name1; } set { ad_name1 = value; } }
public string    name2 { get { return ad_name2; } set { ad_name2 = value; } }
public string    strasse { get { return ad_strasse; } set { ad_strasse = value; } }
public string    hausnr { get { return ad_hausnr; } set { ad_hausnr = value; } }
public bool      kunde { get { return ad_kunde; } set { ad_kunde = value; } }

Das logische Feld ad_kunde ist je nach Datenbanksystem entweder boolean oder sbyte (MySQL) oder decimal (Oracle) :


if (rw["ad_kunde"] is Boolean) kunde = (bool)rw["ad_kunde"]; else if (rw["ad_kunde"] is sbyte) kunde = ((sbyte)rw["ad_kunde"] == 1); else kunde = ((decimal)rw["ad_kunde"] == 1);

Grüße Bernd

20.04.2021 - 11:17 Uhr

Es funktioniert !

Das Problem war dass beim Ändern von Zertifikat, Apple ID, App ID oder Provisionierungsprofil die alten Werte immer irgendwo stehen bleiben und leider manchmal benutzt werden. Die automatische Bereitstellung in iOS-Bundle-Signierung hört sich gut an, kann man wohl für Beta Versionen per Ad Hoc Distrubution nicht benutzen.

Lösung war das manuelle Löschen der Dateien für Zertifikate und Profile.

Meine Schritte auf dem Windows 10 Rechner :

  1. Dateien in C:\Users??\AppData\Local\Xamarin\iOS\ löschen

  2. Apple ID neu hinzufügen, Profile laden

  3. Verzeichnis löschen : C:\Net\Android\Finderwille Einsatz App\XamarinForms.LocationService.iOS\obj\iPhone\Release

  4. iOS Projekt bereinigen und neu erstellen

  5. Extras / iOS / Mit Mac koppeln

  6. iOS-Bundle-Signierung
    (*) Manuelle Bereitstellung
    Signierungsidentität : Apple Distribution: Bernd Quambusch (828G3XCPH9)
    Bereitstellungsprofil : Finderwille Ad Hoc Distribution
    Benutzerdefinierte Berechtigungen : <Dateiname Löschen>

  7. Release iPhone XamarinForms.LocationService.iOS Natascha's iPhone 6s
    Das iPhone ist am Mac angeschlossen und Bildschirm entsperrt.
    Starten ohne Debuggen (Strg + F5)

  8. iOS Archivieren

  9. Verteilen / Ad Hoc
    Manuelle Bereitstellung
    Signierungsidentität : Apple Distribution: Bernd Quambusch (828G3XCPH9) (1. Auswahl von 4 Einträgen)
    Bereitstellungsprofil : Finderwille Ad Hoc Distribution
    [Speichern unter]

  10. [Ordner öffnen]
    C:\Archives *.ipa auf Website hochladen und Info.plist Datei erstellen.

Nun kann ich die App von der Website per Klick installieren : https://www.finderwille-frankfurt-main.de/finderwille-einsatz-app-betaversion/

  1. App per xcode vom iPhone löschen und von der Website neu installieren.

Die Entwicklung von mobilen Apps in xamarin.forms gefällt mir gut, eine tolle Sache ! Wird nicht meine letzte App bleiben.

Allerdings ist die Integration noch nicht perfekt, es hakt an vielen Stellen.

Beispiele :

  • Date Picker geht nicht im Dark Mode

  • Beim Löschen von Zertifikaten, Apple ID, App ID oder Provisionierungsprofil müssen die Dateien dazu manuell gelöscht werden

  • Man kann die Developer ID im Visual Studio auf dem Mac nicht editieren oder löschen

  • /bin/release Verzeichnis auf Windows Rechner muss man vor dem Build manuell löschen

  • Der Windows Rechner verliert immer die Verbindung zum Mac, muss man immer manuell neu verbinden

  • Android : In der Standard Installation gibt es immer den Fehler "Copy of the mdbs files failed". Man muss die Pfadeinstellungen für Archive ändern und kürzere Pfade eintragen.
    Es kommt öfter vor dass bei Xamarin die Pfade länger als 256 Zeichen werden und Windows damit nicht zurecht kommt.
    Siehe https://github.com/xamarin/xamarin-android/issues/5584

  • Die kostenlose Bereitstellung besser ignorieren und überhaupt nicht damit anfangen, auch wenn es anfangs verlockend klingt.

  • Für die Bereitstellung am besten 2 iOS Devices benutzen, eines zum Erstellen des Projektes und eines zum Testen der Installation.

Zu meiner ursprünglichen Frage : Man kann die App mit Openssl.exe oder xcode tools auch per Script signieren und packen, da muss man sich aber besser auskennen. Das mache ich vielleicht später mal.

Grüße Bernd

19.04.2021 - 21:43 Uhr

Es gibt anscheinend Möglichkeiten mit den Xcode Tools zu signieren. Leider bekomme ich es noch nicht mal in der IDE hin.

Bisher habe ich es genau einmal hinbekommen dass eine App rausgekommen ist die man installieren konnte. Und die lief genau einen Tag, dann ließ sich die App nicht mehr starten.

Jetzt schreibe ich jeden Schritt genau auf, damit ich es reproduzieren kann.

Folgende Schritte mache ich um eine App fürs iPhone zu erzeugen :

Auf dem Windows 10 Rechner :

  1. Alle Zertifikate / Profile löschen

  2. Extras / iOS / Mit Mac koppeln

  3. Clean / Rebuild / Deploy Project

  4. Release iPhone XamarinForms.LocationService.iOS Remotegerät (falls Natascha's iPhone 6s nicht vorhanden)
    Starten ohne Debuggen (Strg + F5)

  5. Release iPhone XamarinForms.LocationService.iOS Natascha's iPhone 6s
    Starten ohne Debuggen (Strg + F5)

  6. Eigenschaften XamarinForms.LocationService.iOS
    iOS-Bundle-Signierung
    Schema : (*) Automatische Bereitstellung
    Team : Bernd Quambusch - Individual - 828G3XCPH99 (bq@go-online.de)

5a. Apple Konto entfernen / hinzufügen

5b. Eigenschaften XamarinForms.LocationService.iOS
iOS-Bunde-Signierung
Schema : (*) Manuelle Bereitstellung
Signierungsidentität :
Team : Bernd Quambusch - Individual - 828G3XCPH99 (bq@go-online.de)

  1. Projektmappe XamarinForms.LocationService.iOS
    Archivieren

  2. [Verteilen] [Ad-hoc]

  3. Extras / iOS / Mit Mac koppeln

8a. Extras / Optionen / Xamarin / iOS-Einstellungen
Speicherort für Archive : C:\Archive (Sonst kommt Fehler MDB Files ...)
Enable Hot Restart = Nein

  1. Archiv-App signiert mit : B4120F70629EC3....
    Manuelle Bereitstellung
    Signierungsidentität : Bernd Quambusch (2. Eintrag)
    Bereitstellungsprofil : Finderwille Einsatz App Distribution
    Speichern unter : C:\Users\bq\AppData\Local\Xamarin\iOS\Archives
    XamarinForms.LocationService.ipa [Speichern]

  2. [Ordner öffnen]
    C:\Users\bq\AppData\Local\Xamarin\iOS\Archives
    XamarinForms.LocationService.ipa hochladen

Auf dem Mac
========

  1. Visual Studio starten

  2. iOS als Startprojekt festlegen

  3. Release | iPhone : Generisches Gerät

  4. iOS Einstellungen : iOS-Bündelsignierung / Signierungsidentität Verteilung: Bernd Quambusch (828G3XCPH9)
    Bereitstellungsprofil : Ad-hoc (automatisch)

  5. Erstellen : Projektmappe bereinigen / neu erstellen

  6. iOS : Für Veröffentlichung archivieren

  7. Signieren und verteilen / Ad Hoc

  8. Apple Developer Portal :
    Profiles : Generate
    () iOS
    (
    ) Ad Hoc
    App ID : Visual Studio Wildcard
    Certificate : Bernd Quambusch (Distribution)
    [x] Select All Devices
    Name : Finderwille Ad Hoc Distribution
    [Generate]

  9. Bereitstellungsprofil ( ) Vorhandene Identität und vorhandenes Bereitstellungsprofil verwenden
    59B87C2...
    (*) Mit anderer Identität und anderen Bereitstellungsprofil erneut signieren
    Signierungsidentität : Distribution: Bernd Quambusch (828G3XCPH9)
    App : ...iOS.app
    Bereitstellungsprofil : Finderwille EInsatz App Distribution
    [Veröffentlichen]
    [Ersetzen]

Die erzeugte IPA Datei funktioniert leider nicht.

Auf dem iPhone : " 'Finderwille Einsatz App' kann nicht installiert werden. Versuche es später noch einmal."

Auf der System Konsole des iPhones steht nur : "This app could not be installed at this time" "Invalid Status Code 484" "Error Domain ... Code 1404"

Weitere Fehlermeldungen gibt es nicht.

Da muss ich mal weiter probieren ...

Oder hat da jemand eine idee ?

Grüße Bernd

10.04.2021 - 21:32 Uhr

ich habe jetzt einen kostenpflichtigen Account bei Apple Developer und habe es nun geschafft eine Beta Version Online zu stellen (Adhoc Deployment).

Der kostenlose Account kann nicht viel und man macht mehr kaputt damit. Ich musste viele Umwege gehen bis App ID, Bundle ID, Certificate, Provisioning Profile und Signature funktioniert haben. Am Ende musste ich alle löschen und neu vom VS erstellen lassen.

XCode ist sehr wackelig und ich habe nun alles auf dem Windows Rechner gemacht. Der Mac muss eingeschaltet sein und ein iPhone muss angeschlossen sein. Zum Glück bekomme ich ein altes iPhone geschenkt. Das Windows Visual Studio läuft gut mit dem Mac zusammen und holt sich alle notwendigen Dokumente von der Apple Developer Seite. Und legt alles an was man braucht !

Hier ist das Ergebnis : Die Finderwille Einsatz App Betaversion | Finderwille Frankfurt/Main

Bitte nicht installieren, ich brauche zuerst die iPhone Seriennummer (UDID), sie muss in das Package eingetragen werden.

Grüße Bernd

08.04.2021 - 23:15 Uhr

Ja, ist quick and dirty.

Eine saubere Trennung ist besser.


public double HauptspeichernutzungInMegabyte()
{
	return Environment.WorkingSet / 1024 / 1024;
}

Gilt für 32-Bit Applikationen.

Grüße Bernd

08.04.2021 - 15:04 Uhr

Außerdem prüfe ich den Hauptspeicherbedarf. Wenn ein Anwender versucht eine Liste mit 100 Millionen Datensätzen anzuzeigen kommt eine entsprechende Fehlermeldung.
Wie kannst Du das denn, wenn doch der Reader strikt vorwarding ist, du also noch gar nicht weißt, wie viele Daten kommen werden?

Meine Applikation ist 32 Bittig und ich erlaube 768 MB Hauptspeichernutzung beim Erstellen des Reports. Bis zu 2048 MB sind möglich.

Wenn man eigene Arrays / Listen benutzt spart man viel Speicher gegenüber einer DataTable, da diese die Zeilen mehrfach speichert.

So auf die Schnelle :


using (SqlDataReader x_reader = x_ermittle_verpackungen_kunde.ExecuteReader())
{
     while (x_reader.Read())
     {
            cBestaende.Rows.Add(...);
            if (HauptspeichernutzungInMegabyte() > 768) { Message("Der Bericht ist zu groß um ihn vollständig auszugeben !"); break; }
            progresslabel.Text = "  Bericht wird erstellt ... " + (index++ * 100 / length).ToString() + " %  ";
            progresslabel.BringToFront();
            Application.DoEvents();
     }
}

"Application.DoEvents();" ist böse, besser einen eigenen Task für die Anzeige erstellen.

Grüße Bernd

08.04.2021 - 12:47 Uhr

using (SqlDataReader x_reader = x_ermittle_verpackungen_kunde.ExecuteReader())
{
     while (x_reader.Read())
     {
            cBestaende.Rows.Add(...);
     }
}

Ob das schneller ist weiß ich nicht. Aber man kann dem Anwender eine Progressbar anzeigen und einen Abbruch Button zur Verfügung stellen.

Bei mir hat alles was länger als 2 Sekunden dauert eine Progressbar.

Außerdem prüfe ich den Hauptspeicherbedarf. Wenn ein Anwender versucht eine Liste mit 100 Millionen Datensätzen anzuzeigen kommt eine entsprechende Fehlermeldung.

Grüße Bernd

08.04.2021 - 10:13 Uhr

Ja, Neustart ist immer gut !

Der SQL Server bekommt den gesamten SQL Befehl und übersetzt ihn und führt ihn aus. Das ist ja Sinn der Sache.

Wenn Du eienn SQL Befehl mit Parametern übergibst dann setzt der SQL Server die Parameter ein, Du musst Dich nicht um länderspezifische Darstellung oder Sonderzeichen kümmern (SQL Injection).

Die Parameter haben noch den Vorteil dass der SQL Server jedes Kommando nur einmal übersetzen muss wenn sich nur die Parameter ändern.

Ich verzichte bei großen Datenmangen auf Tables und DataSet weil man nie weiß was beim Kunden passiert.

Lieber DataReader und selber durchgehen.

Grüße Bernd

07.04.2021 - 14:12 Uhr

Und was passiert bei


while (x_reader.Read())
{}

Was soll mit den Daten geschehen ?

DataSet und DataTable ist wie Abt schon gesagt sehr speicher- und zeitintensiv.

Ich benutze bei großen Datenmengen nur DataReader. Beim DataTable weiß man nie ob das beim Kunden funktioniert oder nicht.

Und statt select * die Spalten angeben die man braucht.

Grüße Bernd

07.04.2021 - 11:44 Uhr

Was passiert wenn Du exakt den gleichen SQL Befehl im Code ausführst wie der aus dem Management Studio ?

Was passiert wenn Du einen DataReader benutzt ?

Ich denke dass man das Management Studio eher mit einem DataReader vergleichen kann weil es während der Ausführung responsiv bleibt und im Hintergrund lädt.

Wenn es eine Tabelle anzeigt ist es oft noch nicht fertig mit laden.

Grüße Bernd

07.04.2021 - 11:14 Uhr

Danke, werde ich testen !

Hast Du dazu die Signatur aus dem Apple Developer Center benutzt ? Dann braucht man den kostenpflichtigen Developer Account, den habe ich noch nicht.

Mit XCode kann man auch ohne diesen Account signieren, ich weiß aber nicht ob nur für angeschlossene Handys gilt oder für alle Handys.

Für die Entwicklung benutze ich nur Visual Studio, auf Windows und auf dem Mac. Xcode habe ich nur für da Anmelden des iPhones und für das Signieren benutzt.

Die App werde ich später über einen Link auf der Homepage verteilen, so wie hier (2. Link) : https://www.finderwille-frankfurt-main.de/finderwille-einsatz-app-betaversion/

Grüße Bernd

06.04.2021 - 22:58 Uhr

Hallo,

nach einigen steinigen Wegen und 1 h Telefonat mit Apple USA und 1,5 h Telefonat mit Apple München funktioniert nun mein Mac Mini mit XCode und Visual Studio.

Visual und Studio und XCode haben ja Funktionen um Apps zu signieren (archivieren) um sie für Ad Hoc Deployment per Link auf Website bereitzustellen.

Kann man die Signaturen manuell hinzufügen z.B. mit openssl ?

Apple braucht eine p12-Datei.

Wenn man die Signaturen per Skript hinzufügen könnte würde das meinen Ablauf für die Bereitstellung erheblich vereinfachen und sicherer machen.

Außerdem kriege ich es bisher nur ab und zu hin die Signaturen für iOS zu erstellen, das ist recht wackelig in XCode.

Grüße Bernd

03.04.2021 - 21:48 Uhr

Das erinnert mich an eine Frage an eine Software Firma nach einem Vortrag im Jahr 1990 :

"Wir schreiben Software für Krankenhäuser und da haben wir ab und zu Patienten mit Geburtstag vor dem 1.1.1900. Das kann man nicht eingeben !"

Antwort : "Das Problem löst sich mit der Zeit von alleine !"

Grüße Bernd

03.04.2021 - 01:40 Uhr

Jetzt habe ich ein iPhone zum Testen. Das Testen auf einem Gerät ist leider nicht so einfach wie mit einem Android Gerät. Da dauert es nur wenige Minuten bis die App auf dem Handy läuft.

ich scheitere immer daran ein Team oder ein Bereitstelungsprofil anzulegen. Das scheint mit dem kostenlosen Entwickleraccount nicht zu gehen obwohl es gehen sollte.

Weder am mac noch am Windows PC.

Leider gibt es auch keine durchgängige Anleitung dazu.

Grüße Bernd

02.04.2021 - 14:11 Uhr

Ja. Dann mach mal !

Design ist nicht mein Ding.

Die Buttons kriege ich alleine hin, da wird das BorderRound / CornerRound und das BorderWidth von iOS anders umgesetzt als beim Android.

Den inaktiven Button kann man nicht lesen, mal sehen.

Ich bin ja froh dass es überhaupt läuft.

Bis es perfekt ist ist es noch etwas Arbeit.

Den Remote iOS Emulator hab ich eben getestet, er startet aber bleibt schwarz. Das war ja schon beschrieben dass der nicht geht.

Ich habe auch aus Versehen Android Code in das gemeinsame Projekt geschrieben, muss ich auch ändern. Aber so auf Anhieb eine tolle Entwicklungsumgebung für Android und iOS und läuft auch auf dem M1 !

Grüße Bernd

PS.: Zeitformat ist auch falsch bei Einsatzbeginn. Das sind aber alles Luxus-Probleme !

01.04.2021 - 23:41 Uhr

Meine App läuft auf Anhieb auf dem iOS Emulator des mac mini mit M1 Prozessor :

Hot XAML Reloading ist abgeschaltet !

Grüße Bernd

01.04.2021 - 21:37 Uhr

Mac mini ist angekommen. Visual Studio und xcode sind installiert.

Das erste Projekt läuft : Xamarin.Forms auf iOS Emulator.

Android Emulator kann ich einrichten, läuft aber nicht.

Der Remote iOS Emulator, um iOS Emulator auf Windows laufen zu lassen, soll nicht gehen, den brauche ich aber auch nicht.

Grüße Bernd

30.03.2021 - 11:53 Uhr

Man kann das Formular direkt in Word erstellen 😉

Man kann so etwas aber auch einfach in Winforms selber machen :

Eine Anzahl Felder, dazu Feldtitel und Format ("string 10", "double 8.2", "bool"). Schon ist ein einfacher Formulargenerator fertig.

Man kann natürlich auch eine IDE nachbauen : Crafting a C# Forms Editor from scratch

Grüße Bernd

29.03.2021 - 15:50 Uhr

Ich habe auch lange gebraucht bis meine App auf dem Handy lief.

Die beiden Tipps oben sind wichtig : Protokoll ansehen mit adb.exe und im Visual Studio Debuggen.

Eventuell die App nochmal vom Smartphone entfernen, mit adb uninstall, siehe im Kapitel "Update der Finderwille Einsatz App"

https://www.finderwille-frankfurt-main.de/finderwille-einsatz-app-betaversion/

Grüße Bernd

25.03.2021 - 12:44 Uhr

Hier sind ein paar Beispiele mit MySQL : Zugriff auf SQL Compact und MySQL

Probiere dich mit HeidiSQL anzumelden und die Abfrage auszuführen.

Grüße Bernd

Edit : Text geändert weil ich zuerst dachte Du greifst über die externe IP zu.

20.03.2021 - 21:14 Uhr

M1 ist bestellt, ich werde berichten !

Grüße Bernd

19.03.2021 - 10:51 Uhr

Da Date- und Timepicker in Xamarin.Forms m.M.n. hässlich und nicht intuitiv bedienbar sind und dazu noch im Darkmode nicht funktionieren habe ich jetzt eigene Time- und Datepicker geschrieben. Ganz ohne Design, aber sie funktionieren !

Grüße Bernd

18.03.2021 - 19:18 Uhr

Trotz einiger Hürden bin ich weitergekommen :

Zuerst ließ sich die App nicht auf dem Handy installieren, die Fehlermeldung lautete "App nicht installiert".

Erst nach einigen Recherchen konnte ich das genaue Protokoll mit dem Programm adb anschauen und den Fehler eingrenzen.
Mit adb konnte ich die vorherige Version komplett de-installieren und die neue Version installieren.

Das Layout hatte ich komplett auf Grid umgestellt und so passt es sich an die verschiedenen Auflösungen an. Nur die Schriftgröße nicht. Die muss man manuell anpassen.
Dazu gibt es jetzt ein Menü mit dem man die Schrift größer und kleiner machen kann.
Im Listview kann ich die Schriftgröße leider nicht ändern, das habe ich dann anders gelöst.

Die erste Rückmeldung der Beta Version : "Man kann nichts sehen !"
"Dark Mode" was ist das ?
Für den Dark Mode muss man so einige Controls anpassen, dann klappt das auch. Nur der DatePicker läuft nicht, der zeigt seine Werte weiß auf weiß an. Lässt sicher leider nicht ändern. Das ist ein known issue und wird hoffentlich bald behoben.

Inzwischen läuft die App sehr gut auf vielen verschiedenen Android Devices.

Link : https://www.finderwille-frankfurt-main.de/finderwille-einsatz-app-betaversion/

Als nächstes kommt die iOS Version dran. Ich habe nun ein MacBook Pro leiheise hier. Leider muss sehr viel installiert werden, so werde ich mir doch einen eigenen Mac zulegen.

Grüße Bernd

16.03.2021 - 20:26 Uhr

Ich bin auch dabei mir einen Apple zu kaufen für iOS und MacOS Apps.

Einige bekommen ihre Xamarin Projekte auf dem M1 zum laufen. Warum es manchmal nicht geht weiß nicht.

Der Fehler beim Debugging ist anscheinend im Big Sur 11.2 behoben :

Debugging on Apples M1 platform fails.

Letzter Beitrag !

Und : Xamarin Mac development on Big Sur / M1 processors?

Auch letzter Beitrag.

Die bisherige Installation auf M1 läuft natürlich auf Rosetta (x86 Emulator) : Visual Studio for Mac plans for Apple M1 / ARM-based processors/1288531

Der Remote iOS Emulator um iOS Apps auf Windows zu starten scheint nicht zu funktionieren : Remoted iOS Simulator shows up as black screen

Ich werde mir wahrscheinlich einen Mac mit einem i5 zulegen. Oder doch M1 ? No Risk no fun !

Grüße Bernd

15.03.2021 - 14:33 Uhr

Der Query Builder ist ja fast genauso wie mein ORM.

Ich habe es nach einem Vortrag der .NET User Group in Bad Homburg über Statemachines und Fluent APIs im Jahr 2015 geschrieben.

Ich kann diese Vorgehensweise sehr empfehlen weil die Programmierung wirklich sehr einfach und typsicher ist.

Eine Grammatik kann ich bei mir nicht einbauen da ich sonst keine fallweise Verknüpfungen machen kann wie


if (...) qry = qry.sn_nr().IsLike(SuchfeldString(such_sn_nr)).And();

Bzw. ich hab's nicht hinbekommen.

Zusätzlich erstelle ich für die Datenbankstruktur Klassen, so dass die Query typsicher ist und Intellisense funktioniert. Das macht der Query Builder nicht glaube ich.

Grüße Bernd

15.03.2021 - 12:17 Uhr

Ich habe bei allen Abfragen immer variable Filter.

Das sieht bei mir so aus :



// Alt
string sqlstr = "SELECT * FROM ad WHERE ";
if (such_ad_match.Text.Trim() != "") sqlstr += "ad_match LIKE '" + such_ad_match.Text.ToSqlString() + "%' AND ";
if (such_ad_nr.Text.Trim() != "") sqlstr += "ad_nr = '" + such_ad_nr.Text.ToSqlString() + "' AND ";
if (such_ad_kdnr.Text.Trim() != "") sqlstr += "ad_kdnr = '" + such_ad_kdnr.Text.ToSqlString() + "' AND ";
if (such_ad_nam1.Text.Trim() != "") sqlstr += "ad_name1 = '" + such_ad_name1.Text.ToSqlString() + "' AND ";
...

// Neu mit (eigenem) ORM und Parametern
clsDataQuery qry = new clsDataQuery("sn").Where();
if (such_sn_nr.Text != "")		qry = qry.sn_nr().IsLike(SuchfeldString(such_sn_nr)).And();
if (such_sn_arnr.Text != "")	qry = qry.sn_arnr().IsLike(SuchfeldStringExakt(such_sn_arnr)).And();
if (such_sn_status.Text != "")	qry = qry.sn_status().IsLike(SuchfeldStringExakt(such_sn_status)).And();
...

Der Code wird maschinell erstellt für Winforms, WPF und Xamarin.Forms.

Ich finde das für den Anwender sehr komfortabel. Für den Programmierer auch.

Grüße Bernd

05.03.2021 - 08:34 Uhr

Sorry, habe ich falsch verstanden.

Es gibt Designer die man einbauen kann.

Es ist aber auch nicht schwierig Felder dynamisch anzuzeigen. Das klappt gut in Winforms und auch in WPF.

Die Eingabefelder kann man dann z.B. dynamisch als json in einem Datenbankfeld speichern.

Grüße Bernd

04.03.2021 - 21:27 Uhr

Ich finde Report Builder sehr gut. Kostet nix und kann jeder bedienen der mit Excel umgehen kann.

Report Builder / Designer 2.0 RC1 - 3.0 released

Ich hatte früher noch FYI Reporting eingesetzt, das gibts aber nicht mehr. Der Nachfolger heisst NReports.

Grüße Bernd

02.03.2021 - 10:00 Uhr

Hallo,

ich möchte hier mein Projekt 'Finderwille Einsatz App' vorstellen an dem ich gerade arbeite.

Durch die Beschränkung die wir zur Zeit bei Trainings und Einsätzen mit unseren Hunden haben habe ich eine App gesucht um Einsätze und einsatznahe Trainings aus der Ferne zu organisieren und die Live Standorte zu sehen. Leider habe ich da nichts gefunden. Also programmiert man so etwas selber !

Da ich mich normalerweise nur mit Desktop Software und Winforms beschäftige tu ich mich da etwas schwer. Aber man lernt ja gerne dazu.

Für die Server Applikation, die die GPS-Koordinaten entgegennehmen, speichern und darstellen soll, habe ich traccar gefunden.
Das ist eine professionelle Open Source Lösung die von Speditionen, Taxiunternehmen, Krankentransporten und Rettungsdiensten eingesetzt wird und bis zu 10.000 Geräte gleichzeitig im Blick haben kann. Der traccar Server kann neben meiner App bis zu 1200 verschiedene GPS Devices tracken, er versteht über 130 Protokolle. Also geht alles vom Hunde-GPS-Halsband bis zum Rettungshubschrauber. Für die Einsatzleitsoftware die hier in Einsätzen verwendet wird gibt es eine Schnittstelle, so dass die Einsatzkräfte auf der Karte der Einsatzleitsoftware erscheinen. Für Einsatzfahrzeuge gibt es OBD2-Dongle, die man einfach einsteckt und man sieht wo das Einsatzfahrzeug im Wald steht.

Die geplante App soll die GPS Koordinaten, einen Einsatz- bzw. Trainings-Status und einige weitere Daten an die Server Software senden.

Als Plattform habe ich Xamarin.Forms gewählt. Soll ja auch später mal auf einem iPhone laufen.

Die erste Hürde war das Laufen im Hintergrund. Das ist wohl etwas sehr böses bei einer Handy App, jeder Hersteller hat Angst um seine Akkulaufzeit.

Ich habe eine Bibliothek mit Beispiel gefunden, die das recht gut abdeckt. Hie muss auch mit einigen Tricks gearbeitet werden.

Zum Vergleich : GPS-Koordinaten abfragen und an einen Server schicken : 5 Programmzeilen. GPS-Koordinaten im HIntergrund abfragen und an einen Server schicken : 1500 Programmzeilen.

Der erste Entwurf war leider mit festen Größen und lief so nur auf meiner Handy Auflösung. Der jetzige Entwurf basiert auf Grids und passt sich vom Layout an alle Größen an. Lediglich die Schriftgröße und die Größe der Schalter muss man manuell anpassen.

Unten der Bildschirm der App (Design ist nicht mein Ding!).

Hier eine Beschreibung mit einigen Beispiel-Bildschirmen : Finderwille Einsatz App | Finderwille Frankfurt/Main

Gestern war der erste Einsatz bei einer Einsatz-Übung. Hat super funktioniert. Der Standort der Teilnehmer war sekundengenau und metergenau zu sehen.

Vorherige Lösungen wie WhatsApp Live Standort, Viewranger oder Outdoor Active hängen schon mal 15 Minuten bis der nächste Standort kommt. Da ist man schon weit in die falsche Richtung gelaufen. Außerdem sind sie in Hessen bei Einsätzen verboten, weil einsatzrelevante Daten nur auf deutschen Servern gespeichert werden dürfen.

Ich werde berichten wie es mit dem Projekt weitergeht.

Grüße Bernd

19.02.2021 - 09:41 Uhr

Wenn die Verbindung nicht funktioniert dann immer mit HeidiSQL probieren mit den gleichen Anmeldedaten.

Wenn es da nicht geht : Anmeldedaten falsch !

Wenn es da geht : Programm falsch !

"data source" kann man statt "server" benutzen, dann aber in 2 Wörtern !

"user id" oder "uid" für Username.

Grüße Bernd

18.02.2021 - 09:51 Uhr

Achte auch darauf dass es intuitiv bedienbar ist. Dass sich ein Wert ändert wenn man mit der Maus drauf klickt finde ich unüblich und nicht vorhersehbar. Ein Button mit "Alter Wert" oder so fände ich besser.

Grüße Bernd

15.02.2021 - 09:25 Uhr

Ich benutze schon lange MoonPDF. Der Entwickler ist auch hier im Forum.

MoonPdf - PDF Viewer Control und PDF Viewer


MoonPdfPanel - A WPF-based PDF Viewer Control

Läuft sehr gut.

Kleiner Nachteil für mich ist dass er die PDF in Bitmap rendert und man so keinen Text rauskopieren kann und Links nicht gehen.

Grüße Bernd

08.01.2021 - 19:13 Uhr

Schau auch hier :

http://download.seven-c.de/files/DatenbankenHowTo.htm#10

Kapitel 11 "Datenbankunabhängige Programmierung"

Grüße Bernd

07.01.2021 - 16:03 Uhr

JSON wird wie folgt deserialisiert :


CustomerData customerdata = JsonConvert.DeserializeObject<CustomerData>(json);

Die Klasse CustomerData kannst Du Dir aus der JSON Datei erzeugen lassen :

https://jsonutils.com/

Grüße Bernd

29.12.2020 - 10:16 Uhr

Mit Dataset und ADO.NET wäre das einfacher als wenn Du Dir die SQL Kommandos selber zusammenbaust :


r2["binary"] = (byte[]) r["binary"];

Ich kopiere Tabellen und Spalten auch einzeln wenn ich nicht weiß ob die Strukturen der beiden Datenbanken gleich sind oder wenn die Datenbanken von verschiedenem Typ sind (Anderes DBMS als Microsoft).

Grüße Bernd

19.12.2020 - 13:28 Uhr

Bei mir sieht das so aus wenn man das Programm schließt :


mel += "Folgende Fenster sind noch geöffnet :";
foreach (Form frm in Application.OpenForms)
	mel += "\r\n" + frm.Text + " : " + frm.Name;

Grüße Bernd

17.12.2020 - 12:39 Uhr

Eine Berechtigung kann eine Software nicht einrichten. Wenn das ginge bräuchte man keine Berechtigungen.

Das muss immer der Adminstrator der IT einrichten.

Man kann Schreib- und Lesevorgänge immer in einen try-catch Block packen, dann bekommt man immer aussagekräftige Fehlermeldungen.

Grüße Bernd

16.12.2020 - 12:21 Uhr

Ich kenne nur den Unterschied zwischen Advertised und Non Advertised Shortcuts.

Vielleicht hat das was damit zu tun.

Advertised Shortcuts kann man nachträglich nicht ändern.

Auswahl eines Setup-Programmes für die eigene Applikation

Grüße Bernd

16.12.2020 - 12:09 Uhr

Das funktioniert nur wenn genau ein Benutzer an der Datenbank angemeldet ist.

Wenn mehrere Benutzer angemeldet sind und gleichzeitig Daten erfassen ist das schwieriger.

Grüße Bernd

14.12.2020 - 13:51 Uhr

Das steht in der Dokumentation zu StreamWriter :


 using (StreamWriter sw = new StreamWriter(file, false, Encoding.UTF8)) ...

Grüße Bernd